首页 > 解决方案 > 在 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 中是否有特殊条件允许我在重复循环中只运行一次命令?

我需要将计数器保留在循环内,以便在每个循环后递增数字,但我也想在它们之间插入一个空行。

标签: 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

推荐阅读