检查'?'的正确方法是什么?在一个案例陈述中

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)

MrJ*_*JLP 7

对于Bash case语句,?是一个匹配任何单个字符/数字的通配符.如果你用\?它来逃避它,特别是试图匹配'?'char.

case将继续找到匹配,所以在这种情况下,如果变量不是[a-c](a,b或c)中,然后如果该变量是1个炭它将匹配.