我想我的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
我做错了什么?
当前回答
如果你只对缺少特定参数的情况感兴趣,参数替换是很好的选择:
#!/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
其他回答
为了安全起见,我建议使用getopts。
这里有一个小例子:
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-hackers.org/howto/getopts_tutorial
这里有很多有用的信息,但我想添加一个我认为有用的简单片段。
它与上面的一些有什么不同?
打印使用到标准错误,这比打印到标准输出更合适 返回另一个答案中提到的退出代码 不使它成为一个班轮…
_usage(){
_echoerr "Usage: $0 <args>"
}
_echoerr(){
echo "$*" >&2
}
if [ "$#" -eq 0 ]; then # NOTE: May need to customize this conditional
_usage
exit 2
fi
main "$@"
如果你只对缺少特定参数的情况感兴趣,参数替换是很好的选择:
#!/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
看看这个bash备考表,它可以帮助很多。
要检查传入的参数的长度,可以使用"$#"
要使用传入的参数数组,可以使用"$@"
一个检查长度和迭代的例子是:
myFunc() {
if [[ "$#" -gt 0 ]]; then
for arg in "$@"; do
echo $arg
done
fi
}
myFunc "$@"
这篇文章帮助了我,但对我和我的情况来说,它遗漏了一些东西。希望这能帮助到一些人。
一个简单的一行工作可以使用:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
这可以分解为:
测试bash变量参数$#不等于1的大小(子命令的数量) 如果为true,则调用usage()函数并以状态1退出 否则调用main()函数
注意事项:
Usage()可以简单的回显"$0:params" Main可以是一个很长的脚本