我最近一直在使用getopts而且我已经把所有东西都搞定了.我有一个问题.我希望它工作,以便如果有人没有在命令行上输入参数,他们会得到帮助文本,例如:
$ ./script
$ help: xyz - argument must be used.
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的.
#!/bin/bash
function helptext {
# ...
}
function mitlicense {
# ...
}
while getopts "hl" opt; do
case $opt in
h) helptext >&2
exit 1
;;
l) mitlicense >&2
exit 0
;;
\?) echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
*) helptext >&2
exit 1
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
使用if测试验证用户输入,如下所示.
所述-z的选项test返回true,如果下面的-z串的长度是零.
if [ -z "$1" ]
then
helptext
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
尝试在脚本中使用它:
#!/bin/bash
[[ $@ ]] || { helptext; exit 1; }
# --- the rest of the script ---
Run Code Online (Sandbox Code Playgroud)
代码行是布尔缩短版本的
if [[ $@ ]]; then
true
else
helptext
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
$@ 是脚本的所有参数
[[ $var ]]
Run Code Online (Sandbox Code Playgroud)
是一个简写
[[ -n $var ]]
Run Code Online (Sandbox Code Playgroud)
请参阅http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
吉尔斯·奎诺特的答案很有效,而且非常简洁; 如果您正在寻找更明确表达意图的解决方案,您可以尝试这些基于参数计数的方法$#:
[[ $# -gt 0 ]] || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)
另外,使用算术表达式:
(( $# > 0 )) || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)
最后,依赖于0评估为false的简写,以及任何非零数字为true:
(( $# )) || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)
William Pursell提供了另一种变体,它既具有描述性又符合POSIX:
test $# -gt 0 || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)
test/ [ ... ]是一个POSIX实用程序/内置,而类似的[[ ... ]]条件是bash-specific(按原样(( ... ))).
然而,通常bash的[[ ... ]]提供了更多的功能,并具有比意外减少test/ [...].