Bash - FOR [duplicate]を使用して数値サフィックスを持つ変数を繰り返す方法

Bash - FOR [duplicate]を使用して数値サフィックスを持つ変数を繰り返す方法

forループを使用してvar0、var1、var2、var3を宣言しました。 forループ内で変数をエコーする方法は?コードは次のとおりです。

#!/bin/bash

for i in {0..3}
do
  export var$i=$i
done;

そこでvar0、var1、var2、var3を定義しました。ループからどのようにアクセスできますか?

私は次を試しました

for i in {0..3}
do
  echo $var$i
  tmpvar=var$i
  echo $tmpvar
done

しかし、誰も私にvar0、var1の値を教えてくれませんでした。最初のエコーは「0,1,2,3」だけを印刷し、2番目のエコーは「var0、var1、var2、var3」を印刷しました。そうですか?私は価値が欲しい..

答え1

一方、

var0=a
var1=b
var2=c

ksh93 または bash 4.3 以降の場合、namerefs を使用して個々の変数を指すことができます。

for i in 0 1 2; do
    typeset -n p="var$i"
    echo "$p"
done

ただし、変数は別々のスカラーとして明示的に必要であり(たとえば、環境を介して変数を渡すため)、厳密な標準シェルを使用せず、代わりにBashまたはkshを使用しない限り、配列を使用する必要があります。

#!/bin/bash
a=(a b c)
for i in 0 1 2; do
    echo "${a[i]}"
done

またはインデックスを無視してください。

for x in "${a[@]}"; do
    echo "$x"
done

(もちろん、Zshにはデフォルトで1からインデックスが付けられた配列もあるため、最初の配列は直接機能しません。)

答え2

これを達成するためにevalを使用できます。

$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done

引用とエスケープに注意してください。値にスペースまたはワイルドカードが含まれている場合、最初の3つは値をスペースに分割し、ワイルドカードと一致するすべてのファイル名を拡張します。これはあなたが望むものかもしれないし、そうでないかもしれません。たとえば、

$ var1='< x >' var2='< * >'
$ for i in 1 2;実行 eval echo \$var$i;
<x>
<[現在のディレクトリのファイル名一覧]>

(および別々の引数を受けた後、周囲の二重スペースは単一のxスペースに縮小されました。)echo<x>

この問題を解決するには、変数拡張がで参照されていることを確認する必要がありますeval。たとえば、次のようになります。

$ for i in 1 2; do eval echo \"\$var"$i"\"; done
<  x  >
< * >

(また、数字が含まれていない$iことを知らない限り、上記の内容を引用してください。)IFS

関連情報