我想我的Bash脚本打印一个错误消息,如果所需的参数计数没有满足。
我尝试了以下代码:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
由于一些未知的原因,我得到了以下错误:
test: line 4: [2: command not found
我做错了什么?
我想我的Bash脚本打印一个错误消息,如果所需的参数计数没有满足。
我尝试了以下代码:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
由于一些未知的原因,我得到了以下错误:
test: line 4: [2: command not found
我做错了什么?
当前回答
就像任何其他简单的命令一样,[…]或test的参数之间需要空格。
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Or
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
建议
在Bash中,更喜欢使用[[]],因为它不会对变量进行分词和路径名展开,除非它是表达式的一部分,否则引号可能是不必要的。
[[ $# -ne 1 ]]
它还具有一些其他特性,如不加引号的条件分组、模式匹配(使用extglob扩展模式匹配)和正则表达式匹配。
下面的示例检查参数是否有效。它允许一个或两个参数。
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
对于纯算术表达式,使用(())to某些可能仍然更好,但它们仍然可以在[[]]中使用其算术运算符,如-eq, -ne, -lt, -le, -gt或-ge,将表达式作为单个字符串参数:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
如果您需要将它与[[]]的其他特性结合使用,这应该会很有帮助。
请注意,[[]]和(())是与if、case、while和for具有相同解析级别的关键字。
同样,正如Dave建议的那样,错误消息最好发送到stderr,这样当stdout被重定向时,它们就不会被包括在内:
echo "Illegal number of parameters" >&2
退出脚本
当向脚本传递无效参数时,使脚本退出也是合乎逻辑的。这已经在ekangas的评论中提出了,但有人编辑了这个答案,使其返回值为-1,所以我不妨这样做。
-1 though accepted by Bash as an argument to exit is not explicitly documented and is not right to be used as a common suggestion. 64 is also the most formal value since it's defined in sysexits.h with #define EX_USAGE 64 /* command line usage error */. Most tools like ls also return 2 on invalid arguments. I also used to return 2 in my scripts but lately I no longer really cared, and simply used 1 in all errors. But let's just place 2 here since it's most common and probably not OS-specific.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters" >&2
exit 2
fi
参考文献
Bash条件表达式 条件结构 模式匹配 分词 文件名扩展(上一节)路径名扩张) 简单的命令
其他回答
这里有一个简单的一行程序来检查是否只给出了一个参数,否则退出脚本:
[ "$#" -ne 1 ] && echo "USAGE $0 <PARAMETER>" && exit
就像任何其他简单的命令一样,[…]或test的参数之间需要空格。
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Or
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
建议
在Bash中,更喜欢使用[[]],因为它不会对变量进行分词和路径名展开,除非它是表达式的一部分,否则引号可能是不必要的。
[[ $# -ne 1 ]]
它还具有一些其他特性,如不加引号的条件分组、模式匹配(使用extglob扩展模式匹配)和正则表达式匹配。
下面的示例检查参数是否有效。它允许一个或两个参数。
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
对于纯算术表达式,使用(())to某些可能仍然更好,但它们仍然可以在[[]]中使用其算术运算符,如-eq, -ne, -lt, -le, -gt或-ge,将表达式作为单个字符串参数:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
如果您需要将它与[[]]的其他特性结合使用,这应该会很有帮助。
请注意,[[]]和(())是与if、case、while和for具有相同解析级别的关键字。
同样,正如Dave建议的那样,错误消息最好发送到stderr,这样当stdout被重定向时,它们就不会被包括在内:
echo "Illegal number of parameters" >&2
退出脚本
当向脚本传递无效参数时,使脚本退出也是合乎逻辑的。这已经在ekangas的评论中提出了,但有人编辑了这个答案,使其返回值为-1,所以我不妨这样做。
-1 though accepted by Bash as an argument to exit is not explicitly documented and is not right to be used as a common suggestion. 64 is also the most formal value since it's defined in sysexits.h with #define EX_USAGE 64 /* command line usage error */. Most tools like ls also return 2 on invalid arguments. I also used to return 2 in my scripts but lately I no longer really cared, and simply used 1 in all errors. But let's just place 2 here since it's most common and probably not OS-specific.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters" >&2
exit 2
fi
参考文献
Bash条件表达式 条件结构 模式匹配 分词 文件名扩展(上一节)路径名扩张) 简单的命令
一个简单的一行工作可以使用:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
这可以分解为:
测试bash变量参数$#不等于1的大小(子命令的数量) 如果为true,则调用usage()函数并以状态1退出 否则调用main()函数
注意事项:
Usage()可以简单的回显"$0:params" Main可以是一个很长的脚本
看看这个bash备考表,它可以帮助很多。
要检查传入的参数的长度,可以使用"$#"
要使用传入的参数数组,可以使用"$@"
一个检查长度和迭代的例子是:
myFunc() {
if [[ "$#" -gt 0 ]]; then
for arg in "$@"; do
echo $arg
done
fi
}
myFunc "$@"
这篇文章帮助了我,但对我和我的情况来说,它遗漏了一些东西。希望这能帮助到一些人。
你应该在测试条件之间添加空格:
if [ $# -ne 1 ];
then echo "illegal number of parameters"
fi
我希望这能有所帮助。