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

时间:2017-11-02 19:21:07

标签: bash escaping case glob

我使用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  

1 个答案:

答案 0 :(得分:7)

对于Bash case语句,?是匹配任何单个字符/数字的通配符。 如果您使用\?将其转义,则专门尝试匹配'?'字符。

case将继续找到匹配项,因此在这种情况下,如果变量不是[a-c](a,b或c),那么如果变量为1个字符,它将匹配。