【发布时间】:2017-11-02 19:21:06
【问题描述】:
我有以下使用getopts 的bash 脚本。我的代码按预期工作,即,当指定无效选项时,$myopt 变量设置为“?”字符和 case 语句正确处理匹配“?”的代码。
在其他地方我看到使用“\?”的类似代码而不仅仅是“?”在 case 语句中(请参阅代码块的最后三行注释)。
' 有什么具体原因吗?被逃脱了?我知道任何字符都可以使用 '\' 进行转义,但我的代码在不转义 '?' 的情况下工作得很好。
#!/bin/bash
while getopts ":abc" myopt; do
case $myopt in
[a-c])
echo "$myopt is a valid option!" >&2
;;
?)
echo "$OPTARG is an invalid option!" >&2
;;
# \?)
# echo "$OPTARG is an invalid option!" >&2
# ;;
esac
done
为了方便其他人阅读本文,以下代码仅在“?”时才有效被转义(请参阅接受的答案以获得良好的解释)。
#!/bin/bash
while getopts ":abc" myopt; do
case $myopt in
\?)
echo "$OPTARG is an invalid option!" >&2
;;
[a-c])
echo "$myopt is a valid option!" >&2
;;
esac
done
如果脚本文件是 myscript.sh 可以这样测试 -
./myscript.sh -a -z -a
【问题讨论】:
-
另一个原因:假设您有一个选项需要一个参数:
getopts ":abcd:" myopt。如果用户未能提供参数,myopt 将包含:,这将被?)分支吞噬并提供误导性错误消息。