我正在编写一个 bash 程序,用于在文件夹中搜索 .pgn(便携式游戏符号)文件。但在我的程序中,.pgn 扩展名不区分大小写。这意味着它们可以是小写或大写或两者的组合。 (.Pgn、.PGN、.pGn、.等)。
因此,为了检查扩展名,我这样做:
extension="${file: -4}"
extension="${extension,,}"
if [ "${extension}" == ".pgn" ]
我想知道是否有办法以更短的方式做到这一点。我所说的更短,是指在
if
语句中完成所有操作。使用 bash 和正则表达式:
if [[ "$file" =~ \.[Pp][Gg][Nn]$ ]]
或者以小写形式输出
$file
的内容,然后只与小写比较:
if [[ "${file,,}" =~ \.pgn$ ]]
您使用的语法已经正确,但可能是错误的 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;
使用
nocasematch
选项进行简单的模式匹配。无需提取扩展名。
shopt -s nocasematch
if [[ $file = *.pgn ]]; then
echo "PGN file"
fi