在命令行上执行并查看当前 bash 命令

在命令行上执行并查看当前 bash 命令

使用命令行执行和查看 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 中的元素上起作用) ... 命令(或命令组) 定义在dodone命令分组结构之间(这些可以替代for仅在循环的情况下分别用{}代替dodone)又称为循环体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即成功) 这意味着图像已成功转换。

相关内容