以下命令有什么问题?

时间:2014-08-17 17:05:59

标签: bash

我是bash的新手。有人可以指出我代码中的错误。

for x in `ls`;do `if(echo $x|grep "-2"); then rm $x; fi`; done;

我基本上试图删除所有以“-2.jpg”结尾的文件

2 个答案:

答案 0 :(得分:1)

不要在for块内使用命令替换(反引号)。命令替换仅用于获取用于分配给变量或作为另一个命令进行评估的输出。

`if(echo $x|grep "-2"); then echo 'yo'; fi`

您还需要在if和其后面的表达式之间添加一个空格:

if (echo $x|grep "-2"); ...

命令替换也没有必要:

if echo $x | grep "-2"

您还可以使用-q来阻止grep显示消息:

if echo $x | grep -q "-2"

您还需要使用-e来防止-2被解释为grep的错误选项:

if echo $x | grep -q -e "-2"

您的一些变量也应放在双引号内以防止分词:

if echo "$x" | grep -q -e "-2"

在执行命令替换时,首选[{1}}代替反引号:

$()

最后是更好的形式:

for x in $(ls);do ...

其他建议:

最好不要通过分词来获取值,因为它也会受到路径名扩展的影响,并且可能会发生意外更改。请改用for x in $(ls); do if echo "$x" | grep -q -e "-2"; then echo 'yo'; fi; done 循环和进程替换。使用while read时,也可以使用ls逐行显示条目:

-1

在执行命令替换或进程替换时,如果最后一个命令是对外部二进制文件的调用,请添加while IFS= read -r x; do if echo "$x" | grep -q -e "-2"; then echo 'yo'; fi; done < <(ls -1) 以防止不必要的fork:

exec

您也可以使用$(exec ls -1) <(exec ls -1) 进行比较:

grep

答案 1 :(得分:0)

您必须删除do部分的反引号,否则表示您要执行文件名。还要考虑这个替代方案:

for x in `find -name "*-2.jpg"`; do echo $x; echo "yo"; done