Check number of arguments passed to a Bash script
如果不满足所需的参数计数,我希望bash脚本打印一条错误消息。
我尝试了以下代码:
1 2 3 4 5 6 | #!/bin/bash echo Script name: $0 echo $# arguments if [$# -ne 1]; then echo"illegal number of parameters" fi |
由于某些未知原因,我出现了以下错误:
1 | test: line 4: [2: command not found |
我做错什么了?
和其他简单命令一样,
1 2 3 | if ["$#" -ne 1 ]; then echo"Illegal number of parameters" fi |
或
1 2 3 | if test"$#" -ne 1; then echo"Illegal number of parameters" fi |
在bash中,更喜欢使用
1 | [[ $# -ne 1 ]] |
它还具有一些其他的特性,比如不带引号的条件分组、模式匹配(与
下面的示例检查参数是否有效。它允许一个或两个参数。
1 | [[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]] |
对于纯算术表达式,使用
1 2 | A=1 [[ 'A + 1' -eq 2 ]] && echo true ## Prints true. |
如果您还需要将它与
- bash条件表达式
- 条件构造
- 模式匹配
- 词拆分
- 文件扩展名(前路径名扩展)
如果处理数字,使用算术表达式可能是个好主意。
1 2 3 | if (( $# != 1 )); then echo"Illegal number of parameters" fi |
关于[ ]:=,=,=…是字符串比较运算符和-eq、-gt…是算术二进制的。
我会用:
1 | if ["$#" !="1" ]; then |
或:
1 | if [ $# -eq 1 ]; then |
如果您只想在缺少某个特定参数的情况下退出,那么参数替换非常好:
1 2 3 4 5 6 7 | #!/bin/bash # usage-message.sh : ${1?"Usage: $0 ARGUMENT"} # Script exits here if command-line parameter absent, #+ with following error message. # usage-message.sh: 1: Usage: usage-message.sh ARGUMENT |
一个简单的一行程序可以使用:
1 | ["$#" -ne 1 ] && ( usage && exit 1 ) || main |
这可分为:
想注意:
- 用法()可以是简单的echo"$0:params"
- 主脚本可以是一个长脚本
看看这个bash作弊表,它可以帮助很多人。
要检查传入参数的长度,可以使用
要使用传入的参数数组,可以使用
检查长度和迭代的一个例子是:
1 2 3 4 5 6 7 8 9 | myFunc() { if [["$#" -gt 0 ]]; then for arg in"$@"; do echo $arg done fi } myFunc"$@" |
这篇文章对我有帮助,但对我和我的处境来说缺少了一些东西。希望这能帮助别人。
这里有一个简单的一行程序来检查是否只有一个参数,否则退出脚本:
1 | ["$#" -ne 1 ] && echo"USAGE $0 <PARAMETER>" && exit |
如果你想安全的话,我建议你使用getopts。
下面是一个小例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | while getopts"x:c" opt; do case $opt in c) echo"-$opt was triggered, deploy to ci account">&2 DEPLOY_CI_ACCT="true" ;; x) echo"-$opt was triggered, Parameter: $OPTARG">&2 CMD_TO_EXEC=${OPTARG} ;; \?) echo"Invalid option: -$OPTARG">&2 Usage exit 1 ;; :) echo"Option -$OPTARG requires an argument.">&2 Usage exit 1 ;; esac done |
如http://wiki.bash-hacker.org/howto/getopts_tutorial
您应该在测试条件之间添加空格:
1 2 3 | if [ $# -ne 1 ]; then echo"illegal number of parameters" fi |
我希望这有帮助。