多くの値を計算し、各行に数値を持つ変数に格納するBashスクリプトがあります。たとえば、TC_5
入力csvファイルの5行目の値を計算するasという変数があります。すべての値を計算し、命名規則に従って変数に保存したので、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
ダッシュなどのデフォルトのPOSIXシェルでは、これらの機能を使用できません。スクリプトが通常のシェルではなくbashで実行されていることを確認してください。
答え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を使用します。)