【问题标题】:case insensitive check in if loop using regex in shell在外壳中使用正则表达式检查 if 循环不区分大小写
【发布时间】:2023-10-26 14:35:01
【问题描述】:

我想检查以下条件,但它应该不区分大小写。 如果 [ "SPP" == $1 ] 无论如何我可以使用正则表达式来做到这一点。

【问题讨论】:

    标签: shell if-statement ksh case-insensitive


    【解决方案1】:

    您还可以执行以下操作:

    #!/bin/bash
    myParam=`echo "$1" | tr 'a-z' 'A-Z'`
    if [ "SPP" == "$myParam" ]; then
        echo "Is the same"
    else
        echo "It is not the same"
    fi
    

    此脚本会在进行任何字符串比较之前自动将用户输入转换为大写。通过这样做,您将不必使用正则表达式进行不区分大小写的字符串比较。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      迟到总比没有好...

      如果是 ksh93,请使用 ~(i:...) 不区分大小写的通配子模式:

      if [[ $1 == *~(i:spp)* ]]; then
        : matched.
      fi
      

      对于 ksh88(也是 ksh 克隆),使用中间变量 typeset -u'd 强制大写:

      typeset -u tocheck=$1
      if [[ $tocheck == *SPP* ]]; then
        : matched
      fi
      

      【讨论】:

        【解决方案3】:

        你可以使用:

        shopt -s nocasematch
        

        用于 BASH 中不区分大小写的匹配。

        或者,这也应该有效:

        [[ "$1" == [sS][pP][pP] ]]
        

        【讨论】:

        • if [ "[sS][pP][pP]" == "$1" ] then echo $1 else echo "hello" fi 在通过传递 spp 作为参数运行上述脚本时,我不是获得所需的输出 ./b.sh spp hello
        • 你试过了吗:shopt -s nocasematch
        • 好的,我做了更改,因为不需要引号。试试看:[ [sS][pP][pP] == "$1" ]
        • 不确定,但这也不起作用:if [ [sS][pP][pP] == "$1" ] then echo "true" else echo "false" fi
        • 否 两个条件不一样。 Shell glob 模式仅适用于右侧。