使用命令行执行和查看 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
Run Code Online (Sandbox Code Playgroud)
PS:我想从命令行运行它。我不想创建一个单独的文件并运行该文件。
在bash中,循环for用于分配一个范围(即项目列表),在该范围内执行命令(或一组命令)...范围(又名条件)在循环的第一部分内设置for,即do(命令分组结构)之前的部分例如for i in 1 2 3(将在 1-3 范围内工作或在列表 1,2 和 3 中的元素上工作) ... 命令(或命令组do)在和done命令之间定义分组结构(在循环的情况下只能用和分别代替和for{}dodone)又称为循环体for。
编写for循环时,循环的每个命令/部分(命令分组构造除外)都需要以换行符或分号终止,例如:
for i in 1 2 3
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
或者
for i in 1 2 3
do echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
或者
for i in 1 2 3; do echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
或者
for i in 1 2 3; do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)
或使用{ ... }而不是do ... done命令分组结构:
for i in 1 2 3; { echo "$i"; }
Run Code Online (Sandbox Code Playgroud)
请注意,使用未记录的{ ... }命令分组结构而不是bash 中do ... done循环中记录的命令分组结构for并不常见(由于缺乏适当的文档),也不建议使用(由于兼容性原因,并且不能保证它在未来版本中仍然有效) bash)...我只是将其包括在内以进一步说明命令分组结构的概念。
此外,在for循环中,如果范围(即in WORDS ...例如in 1 2 3)不存在,则假设in "$@"(即位置参数列表)例如:
set -- 1 2 3; for i; do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)
有没有办法可以插入
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
Run Code Online (Sandbox Code Playgroud)
请注意,我添加了[ "$?" -eq 0 ] && echo "$i converted"它将检查前一个命令的退出状态代码,并且仅当前一个命令的退出状态代码为(即 successecho "$i converted" )时才会执行,这应该意味着图像已成功转换。0