在 bash 循环中使用 if 语句过滤结果的正确方法

And*_*wby 2 regex bash if-statement

我正在尝试制定一个循环,让我忽略一些匹配项。到目前为止,我有:

for d in /home/chambres/web/x.org/public_html/2018/js/lib/*.js ;  do
    if [[ $d =~ /*.min.js/ ]];
    then
        echo "ignore $d"
    else
        filename="${d##*/}"
        echo "$d"
        #echo "$filename"
    fi

done
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它们似乎仍然包含在内。我究竟做错了什么?

/home/chambres/web/x.org/public_html/2018/js/lib/underscore.js.min.js
/home/chambres/web/x.org/public_html/2018/js/lib/tiny-slider.js
/home/chambres/web/x.org/public_html/2018/js/lib/tiny-slider.js.min.js
/home/chambres/web/x.org/public_html/2018/js/lib/underscore.js
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我是 bash 的新手,所以请善待;)

Tom*_*ech 5

在 Bash 中,正则表达式不包含在 中/,因此您应该将测试更改为:

if [[ $d =~ \.min\.js$ ]]
Run Code Online (Sandbox Code Playgroud)

除了删除封闭的/,我已经转义了.(否则他们会匹配任何字符)并添加了一个$来匹配字符串的结尾。

但实际上,在这种情况下,您可以使用更简单(且速度稍快)的 glob 匹配:

if [[ $d = *.min.js ]]
Run Code Online (Sandbox Code Playgroud)

这匹配任何以.min.js.

  • 为什么这个答案被否决了?这是正确的答案。 (2认同)