プロが教えるわが家の防犯対策術!

以下のスクリプトでLINUX環境でevalが使用できない場合、
input_logを環境変数から取得したいのですが、
何か方法がありますでしょうか?教えてください。


while [ $i -lt 3 ]
do

i=`expr $i + 1`
#入力ファイル名の設定
input_log=log_$i
input_log=`eval echo $"$input_log"`

done

A 回答 (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は直接使うのが普通だと思います。
    • good
    • 0

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を作成しない方法はないでしょうか?

以上よろしくお願いします。

補足日時:2005/04/24 07:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!