Bash: while ループ番号変数

Bash: while ループ番号変数

私の環境には、次の形式を使用して定義された柔軟な数の変数があります。

Var1Value=A
Var2Value=B
Var3Value=C

今、変数が存在する限り、変数を繰り返したいと思います。擬似コードで:

i=1
while [exists "Var"$i"Value"]; do
 echo "found variable, now doing some more complex processing logic"
 #do some more stuff
 i=$((i + 1)) 
done

(配列を使用せずに)bashでこれを行うことはできますか?

ベストアンサー1

使う名前参照。これは他の変数へのポインタと少し似ています(Bash 4.3以降)。

Var1Value=A
Var2Value=B
Var3Value=C
Var4Value=""

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    declare -n p="$n"               # reference to the var
    [ "${p+x}" ] || break           # see if it exists
    echo "$n: '$p'"
done

"${p+x}"x指す変数が存在するかどうかを評価するため、設定されているがp空の変数も処理されます。

または、${!n}名前付き変数を参照する間接変数拡張を使用しますn

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    [ "${!n+x}" ] || break          # see if it exists
    echo "$n: '${!n}'"
done

しかし、実際には配列を使用する必要があります。ここでは、3つの選択肢のどれも標準ではありませんが、配列が最も論理的です。

VarValue=( A B C )

for value in "${VarValue[@]}"; do
    # use "$value" here
    printf 'Value is "%s"\n' "$value"
done

また見なさい:

おすすめ記事