我正在使用这个:
例如./imgSorter.sh -d directory -f format
脚本的内容是:
#!/bin/bash
while getopts ":d:f:" opt; do
case $opt in
d)
echo "-d was triggered with $OPTARG" >&2
;;
f)
echo "-f was triggered with $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
用例 :
$ ./imgSorter.sh -d myDir -d was triggered with myDir
好的
$ ./imgSorter.sh -d -f myFormat -d was triggered with -f
NOK:为什么以 - 开头的字符串没有被检测为标志?
答案1
您已经告诉getopts
该-d
选项应该接受一个参数,并且在您使用的命令行中-d -f myformat
清楚地(?)说“-f
是我给予该-d
选项的参数”。
这不是代码中的错误,而是命令行上脚本的使用错误。
您的代码需要验证选项参数是否正确以及所有选项是否以适当的方式设置。
可能是这样的
while getopts "d:f:" opt; do
case $opt in
d) dir=$OPTARG ;;
f) format=$OPTARG ;;
*) echo 'error' >&2
exit 1
esac
done
# If -d is *required*
if [ ! -d "$dir" ]; then
echo 'Option -d missing or designates non-directory' >&2
exit 1
fi
# If -d is *optional*
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
echo 'Option -d designates non-directory' >&2
exit 1
fi
如果该-d
选项是可选的,并且您想使用默认dir
对于上面代码中的变量的值,您可以首先在循环dir
之前设置为该默认值while
。
命令行选项不能既接受参数又不接受参数。