在 bash 中检查 .pgn 不区分大小写扩展名的更短方法

shorter way to check a .pgn non case sensitive extension in bash

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

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

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

使用 bash 和正则表达式:

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

使用带有简单模式匹配的 nocasematch 选项。无需提取扩展名。

shopt -s nocasematch

if [[ $file = *.pgn ]]; then
    echo "PGN file"
fi

您使用的语法已经正确,但可能是 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

备选方案 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

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

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

备选方案 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;