我写了一个小脚本来旋转目录中所有奇数图片,但我无法让它工作。这是代码。
#!/bin/bash
count=1
for picture in `ls -v *.png`
do
if ["$picture" == "picture_$count.png"]
then
mogrify -rotate 90 "$picture"
count=$(($count+2))
fi
done
有什么建议么?
答案1
相反,只需让 shell 帮你抓取所有奇数文件即可。这样既安全又简单:
#!/bin/bash
for picture in *[13579].png
do
mogrify -rotate 90 "$picture"
done
[]
在 shell 中,glob 匹配其中的任意一个字符,因此通过列出所有奇数,完整的模式匹配当前目录中以 结尾的任何文件奇数.png。无需维护运行计数,而且由于文件名扩展(即 shell 通配符)是命令行执行前发生的最后一件事,因此它不会被带有奇怪字符的文件名所绊倒。
至于你原来的剧本具体有什么问题,空终止字符串指出,您需要在行中的[
和周围添加空格。这是因为不是 的特殊语法,它只是另一个命令:,它是 的同义词]
if
[
if
/bin/[
test
命令。(出于性能原因,您的 shell 可能提供了自己的内置版本[
,但它的行为仍应与外部命令相同,包括所有解析限制。)
[
如果在和之间没有空格"$picture"
,则表示bash
运行一个名为 的命令,其中包含[picture_1.png
两个参数:==
和picture_1.png]
。由于你大概[picture_1.png
您的计算机上没有调用的命令,您的脚本失败。
[
如果在和周围有空格]
,则您将[
使用四个参数运行该命令:picture_1.png
、==
、picture_1.png
和]
。
答案2
[
您的脚本无法正常工作,因为在第 7 行中, 之后和 之前都需要一个空格]
。
例如:
if [ "$picture" == "picture_$count.png" ]
此外,只要没有遗漏奇数,您当前的脚本就会起作用。
答案3
max=$(ls *.png | sort -n | tail -1 | xargs basename -s .png)
for f in seq 1 2 $max
do
mogrify -rotate 90 $f.png
done
答案4
最后我发现了脚本中的错误:
- 首先是注释
[
前后的空格]
这里和这里。 - 其次,感谢我的问题MariusMatutiae 和 Moses,我将第七行从 改为
if ["$picture" == "picture_$count.png"]
并if [ $picture == pagina_$count.png ]
删除"
。
这是最终的脚本。
#!/bin/bash
count=1
for picture in `ls -v *.png`
do
if [ $picture == picture_$count.png ]
then
mogrify -rotate 90 "$picture"
count=$(($count+2))
fi
done