检查bash shell脚本中是否存在输入参数

Check existence of input argument in a Bash shell script

我需要检查输入参数的存在性。我有下面的剧本

1
2
3
if ["$1" -gt"-1" ]
  then echo hi
fi

我得到

1
[: : integer expression expected

如何首先检查输入参数1以查看它是否存在?


它是:

1
2
3
4
if [ $# -eq 0 ]
  then
    echo"No arguments supplied"
fi

$#变量将告诉您脚本传递的输入参数的数量。

或者,您可以检查参数是否为空字符串或类似:

1
2
3
4
if [ -z"$1" ]
  then
    echo"No argument supplied"
fi

-z开关将测试"$1"的扩展是否为空字符串。如果是空字符串,则执行正文。


最好这样示范

1
2
3
4
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

如果参数太少,通常需要退出。


在某些情况下,您需要检查用户是否向脚本传递了参数,如果没有,则返回到默认值。就像下面的脚本:

1
2
scale=${2:-1}
emulator @$1 -scale $scale

这里,如果用户没有将scale作为第二个参数传递,那么我默认使用-scale 1启动android模拟器。${varname:-word}是一个扩展运算符。还有其他扩展运营商:

  • ${varname:=word}设置未定义的varname而不是返回word值;
  • ${varname:?message},如果定义了varname且不为空,则返回varname,或者打印message并中止脚本(如第一个示例);
  • ${varname:+word},仅当varname已定义且不为空时才返回word;否则返回空。


尝试:

1
2
3
4
5
6
7
 #!/bin/bash
 if ["$#" -eq "0" ]
   then
     echo"No arguments supplied"
 else
     echo"Hello world"
 fi


另一种检测参数是否传递到脚本的方法:

1
((!$#)) && echo No arguments supplied!

注意,(( expr ))使表达式按照shell算法的规则进行计算。

为了在没有任何论据的情况下退出,可以说:

1
((!$#)) && echo No arguments supplied! && exit 1

另一种(类似的)方法是:

1
2
3
let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let说:

let: let arg [arg ...]

1
2
3
4
5
6
  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.


我经常将这段代码用于简单的脚本:

1
2
3
4
5
6
7
8
#!/bin/bash

if [ -z"$1" ]; then
    echo -e"
Please call '$0 ' to run this command!
"

    exit 1
fi


只是因为有更多的基点需要指出,我要补充一点,您可以简单地测试您的字符串是否为空:

1
2
3
4
5
if ["$1" ]; then
  echo yes
else
  echo no
fi

同样,如果您期望arg计数,只需测试最后一个:

1
2
3
4
5
if ["$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

对于任何arg或var等等


如果要检查参数是否存在,可以检查参数的是否大于或等于目标参数号。

下面的脚本演示了这是如何工作的

试验室

1
2
3
4
5
6
#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

生成以下输出

1
2
3
4
5
6
7
8
9
10
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

作为一个小提示,bash中的数值测试操作符只对整数(-eq-lt-ge等)起作用。

我想确保我的$vars

1
var=$(( var + 0 ))

在测试它们之前,只是为了防御"[:integer arg required"错误。