![Bash - FOR [duplicate]を使用して数値サフィックスを持つ変数を繰り返す方法](https://linux33.com/image/10887/Bash%20-%20FOR%20%5Bduplicate%5D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%95%B0%E5%80%A4%E3%82%B5%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E6%8C%81%E3%81%A4%E5%A4%89%E6%95%B0%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E6%96%B9%E6%B3%95.png)
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