シェルスクリプトでループを使用して増加する数値の変数値を印刷するには?

シェルスクリプトでループを使用して増加する数値の変数値を印刷するには?

多くの値を計算し、各行に数値を持つ変数に格納する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

[ "$i" != 201 ]条件は常にtrueなので、現在のスクリプトは無限ループに閉じ込められています。

$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

ダッシュなどのデフォルトの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を使用します。)

関連情報