如何在 shell 脚本中使用循环打印递增数字的变量值?

如何在 shell 脚本中使用循环打印递增数字的变量值?

我有一个 Bash 脚本,其中计算了许多值并将它们存储在每行都有一个数字的变量中。例如,我有一个名为 as 的变量,TC_5它计算输入 csv 文件第 5 行的值。我已经计算了所有值并存储在具有命名约定的变量中,TC_<Row_No>因此对于 200 行,我将值存储在:

TC_1
TC_2
.
.
TC_200

现在,我想编写一个循环,可以将所有这些变量的值一起打印到外部文件,而不是手动打印它们。为此,我使用 while 循环,如下所示:

i=0
while [ "$i" != 201 ]
do
    echo "TC_$i" >> Out
    i=`expr $i + 1`
done

我如何修改上面的代码,以便 echo 语句将变量打印TC_<RowNo>Out文件中?

答案1

您当前的脚本陷入了不定式循环,因为条件[ "$i" != 201 ]始终为真。

您必须$i在每次迭代后增加并使用评估打印TC_<RowNo>变量的内容(但是这不安全):

i=1
while [ "$i" -ne 201 ]
do
    eval printf '%s\\n' "\${TC_$i}"
    i=$((i+1))
done >> "Out"

请注意,$i从 开始1,使用-ne进行整数比较并在循环结束时进行重定向while

答案2

在 bash 中执行此类操作的首选方法是使用数组:

TC[1]=something
TC[2]=somethingelse
...
TC[200]=somethingstillelse

i=1
while ((i <= 200)); do
    echo "${TC[i]}" >> Out
    ((i++))
done

但如果您确实想将索引嵌入到普通变量名称中,则可以使用间接变量引用:

TC_1=something
TC_2=somethingelse
...
TC_200=somethingstillelse

i=1
while ((i <= 200)); do
    varname=TC_$i    # Need to store the variable name in a variable first
    echo "${!varname}" >> Out    # The ! (and braces) trigger indirect expansion
    ((i++))
done

请注意,这些功能在像 dash 这样的基本 POSIX shell 中都不可用。确保您的脚本在 bash 下运行,而不是在通用 shell 下运行。

答案3

while稍微改变了你的循环,它对我有用:

i=1
while [ "$i" != 201 ]
do
    echo $TC_$i >> Out
    i=`expr $i + 1`
done

请注意前面的 $TC_$i并删除双引号。 (我包括了 cuonglm 建议的起始值修改。)

(在运行 High Sierra 的 Mac 上使用 iTerm 中的 GNU bash。)

相关内容