Rav*_*mar 2 bash glob escaping case
我在下面使用bash脚本getopts.我的代码按预期工作,即,当指定了无效选项时,$ 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
Run Code Online (Sandbox Code Playgroud)
为了其他阅读的好处,下面的代码只有'?' 被转义(请参阅接受的答案以获得一个很好的解释).
#!/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
Run Code Online (Sandbox Code Playgroud)
如果脚本文件是myscript.sh,它可以像这样测试 -
./myscript.sh -a -z -a
Run Code Online (Sandbox Code Playgroud)
对于Bash case语句,?是一个匹配任何单个字符/数字的通配符.如果你用\?它来逃避它,特别是试图匹配'?'char.
的case将继续找到匹配,所以在这种情况下,如果变量不是[a-c](a,b或c)中,然后如果该变量是1个炭它将匹配.