bash - 在 Bash 脚本重复循环中仅应用一次命令
问题描述
我有一个 bash 脚本重复循环,它检查文件名文件夹中的变量,然后为它找到的每个文件回显一条错误消息,之后它为它成功处理的文件回显正在进行的文件计数。
以下是相关代码:
if [[ $myVar = 1 ]]; then
echo "ERROR: $myFilename"
((count++))
echo -en "Total Files: $count \r"
fi
目标是在它显示的最后一条错误消息和文件总数之间插入一个空行,如下所示:
ERROR: testfile1
ERROR: testfile2
ERROR: testfile3
Total File Count: 3
我遇到的问题是,没有在错误消息后添加 echo "" ,它看起来像这样:
if [[ $myVar = 1 ]]; then
echo "ERROR: $myFilename"
echo""
((count++))
echo -en "Total Files: $count \r"
fi
ERROR: testfile1
ERROR: testfile2
ERROR: testfile3
Total File Count: 3
但是如果我在错误消息之后添加一个 echo "" ,它会在每个错误检查周期中添加空白,所以它看起来像这样:
if [[ $myVar = 1 ]]; then
echo "ERROR: $myFilename"
echo""
((count++))
echo -en "Total Files: $count \r"
ERROR: testfile1
ERROR: testfile2
ERROR: testfile3
Total File Count: 3
我的问题是,如何将空行添加到代码中(在本节中或之后),以便 [echo ""] 仅在最后应用?Bash 中是否有特殊条件允许我在重复循环中只运行一次命令?
我需要将计数器保留在循环内,以便在每个循环后递增数字,但我也想在它们之间插入一个空行。
解决方案
如果您希望错误消息位于运行计数器上方,请在打印错误消息之前tput cuu 1
使用向上移动光标。
#!/usr/bin/env bash
count=0
printf '\n'
for ((i=0; i<10; i++)); do
sleep 0.2 # delay for demonstration purposes
if (( i % 2 == 0 )); then # if we have an error:
tput cuu 1 # move the cursor up 1 line
printf '\r%s\n' "ERROR: processing file $i" # print our error message
tput el # blank the following line
printf '\n' # make new blank line for counter
fi
((count++))
printf '\r%s' "Total files: $count" # now update our counter message
done
...正确地将输出保留为:
ERROR: processing file 0
ERROR: processing file 2
ERROR: processing file 4
ERROR: processing file 6
ERROR: processing file 8
Total files: 10
推荐阅读
- mongodb - 条件匹配时更新嵌套数组中的多个项目
- swift - 从远程 URL 创建矢量 UIImage
- matlab - Matlab - 如何填充 3D 空间中的区域?
- scala - 从 Spark Databricks 文件系统填充属性对象
- javascript - 类型错误:setEmail 不是 onChange 函数
- google-apis-explorer - Directory API Explorer 的有效示例数据?
- coq-tactic - 如何解决关于长度交替附加定理和子列表长度定理的 coq 列表分配
- javascript - 如何将 CSS 和 JS 链接或连接到 Python 代码
- java - Java 正则表达式。仅当特殊字符被数字包围时才保留它们
- python - 无法从 JSON 文件打印数据