解释

解释

只是一个例子:

第一的

cd /usr/lib

并运行

for x in $(ls);do if [ "$x" == "*.a" ];then echo $x;fi;done

我想要做的是选择扩展名为 .a 的文件并打印它们。我知道有更简单的方法可以做到这一点,但这不是我的意图。

问题是上面的命令不起作用。我不知道为什么。我从中学到这一点这个帖子

我也尝试过

[ "$x" == *.a ]    bash: [: too many arguments
[ $x = "*.a" ]    shows nothing
[ $x = *.a ]    bash: [: too many arguments

我知道[[ $x == *.a ]]可行,但我想知道[在这种情况下编写测试的正确方法是什么?

答案1

for x in ./*; do
   case $x in
      *".a" ) echo "$x";;
   esac
done

[结构并不完全适合于此。但如果您坚持的话,我们可以这样做:

[ '.a'  =  ".${x##*.}" ]

解释

假设 $x 包含:my.file.testing.a然后${x##*.}将从左侧开始尽可能多地剥离,直到.它设法在 中看到的最后一个$x。 IOW,我们最终放弃了一切,将extension可视化带到a了前台。现在我们有了刚刚计算出的扩展,以与我们认为更好的(.a)进行比较以取得成功。

答案2

您在问题中链接到的答案使用 bash 的(双括号)扩展测试语法,而您正在尝试使用 POSIX 单括号测试运算符。不同之处在于,在双括号测试中, an 的右侧==被视为模式,而不是进行分词或全局扩展。因此,尽管[ $f == *.a ]会导致[: too many arguments错误,但您可能

for f in *; do if [[ $f == *.a ]]; then echo "$f"; fi; done

或者(更紧凑)

for f in *; do [[ $f == *.a ]] && echo "$f"; done

或者,由于您似乎正在使用bash,因此您可以使用=~正则表达式运算符,例如

for f in *; do if [[ $f =~ \.a$ ]]; then echo "$f"; fi; done

或者(更紧凑)

for f in *; do [[ $f =~ \.a$ ]] && echo "$f"; done

尽管在这种情况下这是矫枉过正的。

相关内容