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

问题描述 投票:0回答:3

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

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

我想知道是否有办法以更短的方式做到这一点。我所说的更短,是指在

if
语句中完成所有操作。
预先感谢您对我的帮助。

bash uppercase lowercase
3个回答
2
投票

使用 bash 和正则表达式:

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

或者以小写形式输出

$file
的内容,然后只与小写比较:

if [[ "${file,,}" =~ \.pgn$ ]]

2
投票

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

1
投票

使用

nocasematch
选项进行简单的模式匹配。无需提取扩展名。

shopt -s nocasematch

if [[ $file = *.pgn ]]; then
    echo "PGN file"
fi
© www.soinside.com 2019 - 2024. All rights reserved.