linux - Bash:检查命令是否返回特定值

标签 linux bash shell conditional-statements 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 表达式的输出总是“something”。

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

George-1983_1A_01_64kbs.mp3

最佳答案

您显然将 globregex 匹配混淆了,* 是一个纯 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 开始支持) regex 而不是 glob

关于linux - Bash:检查命令是否返回特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43062332/

相关文章:

c - 怎么把数字变成字母?

bash - Go:在二进制文件中嵌入 bash 脚本

python - 查找所有具有正方形尺寸的图像 (1 :1 ratio)

bash - 找到一个模式,然后仅在该模式之后执行换行

linux - 从终端历史记录中搜索和替换命令

linux - 检测显示器是否关机

C 程序(编译为 fcgi)给出 500 内部错误

ruby-on-rails - 保持 rake 作业运行

linux - 如何按列值分组到行和列标题中,然后对值求和

创建具有 AX.25 封装的 TUN 网络设备