Bash:检查命令是否返回某个值

时间:2017-03-28 06:40:42

标签: linux bash shell conditional ls

我正在尝试编写一个.sh脚本,在某个时刻它会检查当前目录中是否有一个或多个文件与*\_??\_??\_64kbs.mp3匹配

或者,使用正则表达式^.*\_..\_..\_64kbs\.mp3$

这是对命令的一次尝试:

if [ 'ls *_??_??_64kbs.mp3 2>/dev/null | wc -l ' == 0 ];
then echo "nothing";
else echo "something";
fi

我知道

'ls *_??_??_64kbs.mp3 2>/dev/null | wc -l'

在这种情况下只返回终端的数字9,因为有9个匹配。如果我删除第一个'?',它会返回0,就像它应该一样,因为没有与该表达式匹配的文件名。但上面if表达式的输出总是“某事”。

编辑: 有人要求为我想要匹配的内容提供完整的示例文件名。这是一个:

George-1983_1A_01_64kbs.mp3

2 个答案:

答案 0 :(得分:1)

你显然对 glob regex 匹配感到困惑,*是一个纯粹的glob结构,可以在循环中使用,如下所示

fileNamePattern="*_??_??_64kbs.mp3"
for file in *.mp3; do
    [[ $file == $fileNamePattern ]] && echo "$file matches"
done 

?*的含义在regex上下文中使用时有所不同,我们使用.*来匹配部分和.{}表示任何可能由{}内的值决定出现的角色,例如,

fileNameRegex=".*_.{2}_.{2}_64kbs.mp3"
for file in *.mp3; do
    [[ $file =~ $fileNameRegex ]] && echo "$file matches"
done

~bash正则表达式运算符(从bash版本4.0开始支持)您需要匹配正则表达式而不是水珠

答案 1 :(得分:-1)

我找到了一个似乎有效的解决方案。用$()而不是引号包装命令。

if [ $(ls *_??_??_64kbs.mp3 2>/dev/null | wc -l) == 0 ];
then echo "nothing";
else echo "something";
fi

我之前尝试过这样的事情但它似乎没有用,但肯定会出现语法错误。在这种情况下,它正在运作。