【问题标题】:BASH if 9th character in a line is a specific letter; thenBASH 如果一行中的第 9 个字符是一个特定的字母;然后
【发布时间】:2017-01-01 23:27:36
【问题描述】:

如果“$q”行的第 9 个字符是 A、B、C、D 或 E,如何执行一些步骤。类似的东西?

if [ ${q:9} == [A,B,C,D,E]; then

(如果第 9 个字符是大写字母 A、B、C、D 或 E,则不做;)

我使用if [ ${q:9} == A ]; 来匹配一个字母,并试图构建类似上面的内容或:if [[ "${p:9}" == "A" && "$p" == "B" && "$p" == "C" "$p" == "D" "$p" == "E"]]; then 来匹配多个字母,但无论我使用哪种运算符似乎都不起作用。

【问题讨论】:

  • 索引是从 0 开始的; q 的第 9 个字符是 ${q:8:1}

标签: bash if-statement


【解决方案1】:

使用case 声明:

case ${q:9} in

     [A-E])
     echo found
     ;;

esac

【讨论】:

    【解决方案2】:

    使用正则表达式,您可以选择匹配单个字符或带有任意 8 个字符前缀的字符串:

    if [[ ${q:8:1} =~ [ABCDE] ]]; then
    
    if [[ $q =~ ^.{8}[ABCDE] ]]; then
    

    您也可以使用模式匹配,尽管在这种情况下它看起来与正则表达式完全一样:

    if [[ ${q:8:1} == [ABCDE] ]]; then
    

    【讨论】:

      【解决方案3】:

      只检查第9个字符with a regex的值:

      [[ "${var:8:1}" =~ (A|B|C|D|E) ]]
      

      例如:

      $ v=12345678Axx
      $ [[ "${v:8:1}" =~ (A|B|C|D) ]] && echo "yes" || echo "no"
      yes
      $ v=1234567890
      $ [[ "${v:8:1}" =~ (A|B|C|D) ]] && echo "yes" || echo "no"
      no
      

      为了得到第 9 个字符的注释,我使用 Bash Reference Manual → 3.5.3 Shell Parameter Expansion,所以第 9 个字符是 ${var:8:1},因为索引是从 0 开始的(第一个是 0th):

      ${parameter:offset:length}
      

      这称为子字符串扩展。它扩展到最长 参数值的字符从字符开始 由偏移量指定。如果参数是'@',则下标索引数组 通过“@”或“*”或关联数组名称,结果不同为 如下面所描述的。如果省略长度,则展开为 从 offset 指定的字符开始的参数值 并延伸到值的末尾。长度和偏移量是 算术表达式(参见 Shell 算术)。

      如果偏移量的计算结果小于零,则该值用作 参数值末尾的字符偏移量。如果 长度计算为小于零的数字,它被解释为 从参数值的末尾偏移的字符而不是 比多个字符,扩展是字符 在偏移量和结果之间。请注意,负偏移量必须是 与冒号相隔至少一个空格以避免混淆 带有':-'扩展。

      【讨论】:

        【解决方案4】:

        试试看:

        if [[ ${q:9:1} =~ [ABCDE] ]]; then
        

        ${q:9} 返回从 9 号开始的所有字符(注意,计数从 0 开始)。 ${q:9:1} 从 9 号开始只返回一个字符。 =~ 运算符是“匹配正则表达式”运算符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-11
          • 1970-01-01
          • 2016-03-12
          • 2019-05-26
          • 2012-08-12
          • 1970-01-01
          • 2022-11-04
          相关资源
          最近更新 更多