检查“?”的正确方法是什么?在案例陈述中

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,它将匹配字符