【问题标题】:shorter way to check a .pgn non case sensitive extension in bash在 bash 中检查 .pgn 不区分大小写的扩展名的更短方法
【发布时间】:2019-11-17 13:09:51
【问题描述】:

我正在编写一个 bash 程序,用于在文件夹中搜索 .pgn(便携式游戏符号)文件。但在我的程序中,.pgn 扩展名不区分大小写。这意味着它们可以是小写或大写或两者的组合。 (.Pgn、.PGN、.pGn、.etc)。
所以为了检查扩展我这样做:

extension="${file: -4}"
extension="${extension,,}"
if [ "${extension}" == ".pgn" ]

我想知道是否有办法以更短的方式做到这一点。简而言之,我的意思是在 if 语句中完成所有操作。
非常感谢您帮助我。

【问题讨论】:

    标签: bash uppercase lowercase


    【解决方案1】:

    使用 bash 和正则表达式:

    if [[ "$file" =~ \.[Pp][Gg][Nn]$ ]]
    

    【讨论】:

      【解决方案2】:

      nocasematch 选项与简单的模式匹配一​​起使用。无需提取扩展。

      shopt -s nocasematch
      
      if [[ $file = *.pgn ]]; then
          echo "PGN file"
      fi
      

      【讨论】:

        【解决方案3】:

        你使用了已经使用了正确的语法,但可能是错误的 bash 版本

        如果 bash --version 是 3.* 替换 extension="${extension,,}"无效

        extension="${extension,,}" 适用于 bash >= 4

        for F in Aa.png  Ab.PnG  ; 
        do 
            extension="${F: -4}" ; 
            extension="${extension,,}" ; 
            echo $F : $extension ; 
        done
        

        alternative 1:使用tr 来降低你的扩展名

        extension=$( echo "${extension}"| tr "[:upper:]" "[:lower:]" ) 
        

        备选方案 2:使用 find-iname

        find . -iname '*.pgn'  
        

        循环示例

        for F in $( find . -iname '*.pgn' -print );
        do 
            echo $F;
        done
        

        alternative 3:使用正则表达式匹配扩展名(感谢@Cyrus)

        if [[ "$file" =~ \.[Pp][Gg][Nn]$ ]]
        

        alternative 4 :通过设置选项 nocasematch 来改变 bash 的行为(感谢 @chepner)

        shopt -s 启用 shopt -u 禁用

        一个例子

        file="a.PGn" ; 
        shopt -s nocasematch;  
        if [[ $file = *.pgn ]]; then
            echo "PGN file"; 
        fi; 
        shopt -u nocasematch;  
        if [[ $file = *.pgn ]]; then
           echo "PGN file";
        fi;
        

        【讨论】:

        • 感谢您的深入解释。我很感激
        猜你喜欢
        • 2012-11-17
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多