- ベストアンサー
evalが使えない場合
以下のスクリプトでLINUX環境でevalが使用できない場合、 input_logを環境変数から取得したいのですが、 何か方法がありますでしょうか?教えてください。 while [ $i -lt 3 ] do i=`expr $i + 1` #入力ファイル名の設定 input_log=log_$i input_log=`eval echo $"$input_log"` done
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 なるほど。linuxにはevalが無いと思ったんですね。evalはシェルの組み込みコマンドなので、man sh か man bash です。 linuxとFreeBSDでお書きのものを実行して見ました。 ・FreeBSDのsh →OK (log_1等の中身がセットされる) ・FreeBSDのbash → NG (log_1等の名前がセットされる) ・linuxのbash → NG (同上) ・linuxのsh → NG (同上) OSの違いではなく、shとbashのシェルの違いですね。linuxではshは実はbashなので(ls -l `which sh` `which bash` でわかります)、同じ結果ですが。 ` ` の中でevalを使うなら、$をクォートすることが必要です。 input_log=`eval echo '$'"$input_log"` または input_log=`eval echo \\$"$input_log"` でshでもbashでも上手く行きました。ただ、#1に書いた方法のようにevalは直接使うのが普通だと思います。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4901/10362)
evalを使わないやり方の前に、まずこれ動かなくないですか?$log_1,$log_2,$log_3の値を順に参照するという配列相当のことをしたいんですよね? eval input_log=\$log_$i では? evalを使用しないという制約の理由がわかりませんが、 echo echo \$log_$i > tmp.sh input_log=`sh tmp.sh` でしょうか。 スクリプトの意図が違う場合は補足ください。
補足
回答ありがとうございます。 >配列相当のことをしたいんですよね? はい、そうです。 >eval input_log=\$log_$i >では? こちらの方がシンプルですね。試してみます。 >evalを使用しないという制約の理由がわかりませんが、 これはUNIX環境では、動作したのですが、RedHat環境では動きませんでした。(マニュアルでman evalで出てきませんでした。) >echo echo \$log_$i > tmp.sh >input_log=`sh tmp.sh` >でしょうか。 こちらも試してみたいと思いますが、 tmp.shを作成しない方法はないでしょうか? 以上よろしくお願いします。