使用命令行执行和查看 bash 命令
我有一行代码可以批量转换图像,但它没有显示当前正在操作的图像。我是否可以插入代码echo
来显示当前正在执行的命令?
for i in *.jpg; do convert $i -filter Lanczos -resize 50% converted_$i.jpeg; done;
Example:
After each line it I would like it to show the file it's converting
img1.jpeg converted
img2.jpeg converted
PS:我希望从命令行运行它。我不想创建一个单独的文件并运行它。
答案1
背景
在狂欢循环for
用于分配范围(即项目列表) 中的一个命令(或一组命令) 被执行...范围(又名条件) 在循环的第一部分内设置for
,即do
(命令分组结构) 例如for i in 1 2 3
(将在 1-3 的范围内或列表 1、2 和 3 中的元素上起作用) ... 命令(或命令组) 定义在do
和done
命令分组结构之间(这些可以替代for
仅在循环的情况下分别用{
和}
代替do
和done
)又称为循环体for
。
编写for
循环时,循环的每个命令/部分(除了命令分组结构)需要以新行或分号终止,例如:
for i in 1 2 3
do
echo "$i"
done
或者
for i in 1 2 3
do echo "$i"
done
或者
for i in 1 2 3; do echo "$i"
done
或者
for i in 1 2 3; do echo "$i"; done
或者使用命令分组结构{ ... }
代替:do ... done
for i in 1 2 3; { echo "$i"; }
注意在 bash 中,使用未记录的{ ... }
命令分组结构代替循环do ... done
中记录的命令分组结构的情况for
并不常见(由于缺乏适当的文件)且不建议(由于兼容性原因,不能保证它在未来版本的 bash 中仍然有效)...我只是将其包括在内以进一步说明命令分组构造的概念。
此外,在for
循环中,如果范围(例如in WORDS ...
in 1 2 3
) 不存在,则in "$@"
(即位置参数列表) 假设例如:
set -- 1 2 3; for i; do echo "$i"; done
回答你的问题
有什么方法可以插入
echo
来显示它当前正在执行的命令吗?
是的,你可以for ...; do command1; command2; command3; done
这样做:
for i in *.jpg; do echo "converting $i"; convert "$i" -filter Lanczos -resize 50% converted_$i.jpeg; [ "$?" -eq 0 ] && echo "$i converted"; done
注意我添加了[ "$?" -eq 0 ] && echo "$i converted"
它将检查前一个命令的退出状态代码,并且仅当前一个命令的退出状态代码为(echo "$i converted"
时才会执行0
即成功) 这意味着图像已成功转换。