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