我是bash的新手。有人可以指出我代码中的错误。
for x in `ls`;do `if(echo $x|grep "-2"); then rm $x; fi`; done;
我基本上试图删除所有以“-2.jpg”结尾的文件
答案 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