我使用getopts
使用了以下bash脚本。我的代码按预期工作,即,当指定了无效选项时,$ myopt变量设置为'?'字符和案例陈述当前处理匹配'?'。的代码
否则我会看到类似的代码使用' \?'而不仅仅是'?'在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
答案 0 :(得分:7)
对于Bash case
语句,?
是匹配任何单个字符/数字的通配符。
如果您使用\?
将其转义,则专门尝试匹配'?'
字符。
case
将继续找到匹配项,因此在这种情况下,如果变量不是[a-c]
(a,b或c),那么如果变量为1个字符,它将匹配。