在 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;
我正在编写一个 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;