我有一个 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
答案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。)