我想删除多张分辨率小于 228x228 的图像。为此,我编写了这个 shell 脚本:
#!/bin/bash
for i in $( ls ); do
if [$(identify -format "%w" $i) < 228] && [$(identify -format "%h" $i) < 228];
then
rm $i
fi
done
由于某些原因,我在运行它时得到了这个输出:
./del.sh: line 4: [640: command not found
./del.sh: line 4: [550: command not found
./del.sh: line 4: [315: command not found
...
你能告诉我这个脚本有什么问题以及如何解决它。
谢谢你。
编辑:即使我在括号后添加了空格,我仍然得到一个错误。这是由于使用了<
而不是,-lt
并且已得到修复。现在没有错误。
这里有一些问题:首先,
[…]
测试中的表达式需要围绕它的空格(陷阱#10),其次,比较<
不适用于[…]
测试(陷阱#7)。您要么需要-lt
(小于),要么使用[[…]]
代替,这是一种bashism。此外,for
应该更换循环(陷阱#1)。所以:
您可能还希望避免调用
identify
两次来获取两个维度(陷阱 #58),而是只调用一次,并让它打印一个准备用作 shell 语法中的变量赋值的字符串。如果我们写
它会打印出类似
width=50 heigth=250
. 当我们eval
使用该字符串时,我们只需一次调用就设置了两个变量,条件可以写成:另请参阅:常见的 bash 陷阱。
而不是循环,我会使用
find
with-exec
and-delete
:这还将打印被删除的文件,
-print
如果您不希望这样做,您可以删除。不打算回答,而是提供一个有用的提示,帮助我编写 bash 脚本。
有一个名为 linter 的 shell script linter
shellcheck
可能会捕获 bash 脚本中的一些常见错误并避免一些陷阱。它可以像 ubuntu 中的任何软件包一样安装 -> https://launchpad.net/ubuntu/+source/shellcheck用于universe
当前稳定版。这是您的脚本的输出
如果您修复并再次申请,您将获得已在接受的答案中提到的其他一些建议和修复。