web-dev-qa-db-ja.com

Bash SH-その名前に別の変数を含む新しい変数名を設定します

ループ内で増分var名を作成するだけです。変数は「var名にサイクルの数」を使用する必要があります。

ループ内の例:

# on Cycle=1
MyVar$Cycle=Exec$Cycle   # (equal to MyVar1=Exec1)

# on Cycle=2
MyVar$Cycle=Exec$Cycle   # (equal to MyVar2=Exec2)

# etc...

では、どうすれば変数名を正しく設定できますか?

バッチ処理は簡単に機能します:

set MyVar%Cycle%=Exec%Cycle% ...

しかし、私はそれをバッシュで実現する方法を知りません。

もちろんこのように結ぶMyVar$Cycle=Exec$Cycle 動作しない。

増分varnameを設定できるようにするだけで、必要な値を時々与えることができます。私にとって、スクリプトはすべて正常に機能していますが、新しいvar名のセットはリアルタイムでは機能しません。

2
MauSH

このタスクを解決する1つの可能な方法は、コマンド eval を次のように使用することです。

#!/bin/bash

for i in {1..5}
do
        eval "var$i"="$i"
done

# Output the result
for i in {1..5}
do
        echo -n "\$var$i : "
        eval echo "\$var$i"
done

出力例:

$ ./cycle.sh
$var1 : 1
$var2 : 2
$var3 : 3
$var4 : 4
$var5 : 5

ただし、そのような魔法を回避するために、スクリプトを arrays で動作するように調整することをお勧めします。

#!/bin/bash

for i in {1..5}
do
        array["$i"]="$i"
done

# Output the result
for i in {1..5}
do
        echo "\$array[$i]" : "${array[$i]}"
done

出力例:

$ ./cycle.sh
$array[1] : 1
$array[2] : 2
$array[3] : 3
$array[4] : 4
$array[5] : 5
  • 注:デフォルトでは、Bash配列内の最初のインデックスは[0]ではなく[1]です。
2
pa4080