
只是一个例子:
第一的
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
尽管在这种情况下这是矫枉过正的。