【问题标题】:What is the correct way to check for a '?' in a case statement检查“?”的正确方法是什么?在案例陈述中
【发布时间】:2017-11-02 19:21:06
【问题描述】:

我有以下使用getopts 的bash 脚本。我的代码按预期工作,即,当指定无效选项时,$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  

【问题讨论】:

  • 另一个原因:假设您有一个选项需要一个参数:getopts ":abcd:" myopt。如果用户未能提供参数,myopt 将包含 :,这将被 ?) 分支吞噬并提供误导性错误消息。

标签: bash escaping case glob


【解决方案1】:

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

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

【讨论】:

  • 我现在明白了。由于 '?' 的模式匹配,上面的代码可以正常工作在 case 语句中最后完成。在这种特定情况下,代码是否会起作用?是否逃脱。如果模式匹配 '?'是 case 语句中的第一个测试,它必须被转义。如果我们不使用 '\' 对其进行转义,则 myopt 变量中的每个字符值都与 bash 通配符 '?' 匹配。
  • 是的。最好使用\? 来检查 OPTARG 是否无效以明确。如果单个字符不是'?',那么它将被无效地处理为?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2023-04-10
  • 2010-10-30
  • 2016-05-13
相关资源
最近更新 更多