检查“?”的正确方法是什么?在案例陈述中
What is the correct way to check for a '?' in a case statement
我有以下 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
为了其他阅读者的利益,以下代码仅在“?”时才有效被转义(请参阅已接受的答案以获得很好的解释)。
#!/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
对于 Bash case
语句,?
是匹配任何单个 character/digit 的通配符。
如果您使用 \?
转义它,它会专门尝试匹配 '?'
字符。
case
将继续寻找匹配项,因此在这种情况下,如果变量不是 [a-c]
(a、b 或 c),那么如果变量为 1,它将匹配字符
我有以下 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
为了其他阅读者的利益,以下代码仅在“?”时才有效被转义(请参阅已接受的答案以获得很好的解释)。
#!/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
对于 Bash case
语句,?
是匹配任何单个 character/digit 的通配符。
如果您使用 \?
转义它,它会专门尝试匹配 '?'
字符。
case
将继续寻找匹配项,因此在这种情况下,如果变量不是 [a-c]
(a、b 或 c),那么如果变量为 1,它将匹配字符