在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

我所面临的问题是,在不添加回声的情况下"在错误消息之后,它看起来像这样:

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

但如果我加上一个回声"在错误消息之后,它会在每个错误检查周期中添加类似于空白的内容,所以它看起来像这样:

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%sn' "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

您没有演示实际的循环是如何的。我只能猜测您是如何尝试循环的。

解决方案A:将总计数打印出循环

for myFilename in myFilenameList; do 
if [[ $myVar = 1 ]]; then
echo "ERROR: $myFilename"
((count++))
fi
done
echo
echo -en "Total Files: $count"

解决方案B:将总计数打印保持在循环内,并使用数字确定循环结束

totalLength=${#myFilenameList[@]}
for myFilename in myFilenameList; do 
if [[ $myVar = 1 ]]; then
echo "ERROR: $myFilename"
((count++))
fi
((totalCount++))
if [ $totalCount -eq $totalLength ]; then
echo
echo -en "Total Files: $count"
if 
done

请注意,它们是粗略的想法,而不是工作代码。

最新更新