我有一个需要两个args(filename和MD5hashval)的脚本。我可以使用md5sum test.sh |提取MD5sum的十六进制输出grep -om1'^ [0-9a-f] *。'出于某种原因,从脚本调用时,相同的cmd会失败。检查传递给Bash脚本的cmdline参数的最佳方法是什么?这是代码的样子:
#!/bin/bash
while getopts ":f:s" opt; do
case $opt in
f)
FILENAME=`echo $OPTARG | sed 's/[-a-zA-Z0-9]*=//'`
echo ${FILENAME}
;;
s)
MD5SUM=`echo $OPTARG | grep -om1 '^[0-9a-f]*'`
echo $MD5SUM
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
答案 0 :(得分:3)
由于s
选项需要参数,因此需要在其后放置冒号。它应该是:
while getopts "f:s:" opt; do
...
来自getopts
手册页:
如果一个字符后跟一个冒号,则该选项是预期的 有一个参数,应该用空格分隔。
答案 1 :(得分:0)
我的第一个动作是在实际命令之前放置一个调试行:
echo "[$OPTARG]"
MD5SUM=`echo $OPTARG | grep -om1 '^[0-9a-f]*'`
但它实际上与s
选项字符串中getopts
后面没有冒号的事实有关。您应该使用f:s:
代替:
... optstring包含要识别的选项字符;如果一个字符后跟冒号,则该选项应该有一个参数,该参数应该用空格分隔。
另外,我认为您的错误行应该是-$opt
而不是-$OPTARG
。