文字列をコマンドとして実行する・evalコマンド †evalコマンドを利用すると文字列をコマンドとして評価します。 以下、evalが不要な例と必要な例を記述します。 コマンドだとevalを使用しなくても動作する †$ DATE_CMD="date" $ $DATE_CMD 2011年 1月 31日 月曜日 10:10:10 JST 変数を変更しコマンドを実行するとエラーとなる †以下の場合だとエラーとなってしまいます。 $ DATE_CMD="LANG=C date" $ $DATE_CMD bash: LANG=C: command not found evalにより意図した動作になる †このような場合、evalを利用すると意図した動作になります。 $ DATE_CMD="LANG=C date" $ eval $DATE_CMD Mon Jan 31 17:55:34 JST 2011 文字列評価後にコマンドとして実行する場合 †以下、evalを使用した場合と使用しない場合の違いを記述します。 evalを使用したサンプルスクリプト †#!/bin/bash for i in 0 1 2 do C=(C zh_CN.utf8 ja_JP.utf8) eval echo "C array[$i] is \${C[$i]}" LANG=${C[$i]} date done evalを使用したサンプルスクリプトの結果 †C array[0] is C Mon Jan 31 18:24:44 JST 2011 C array[1] is zh_CN.utf8 2011年 01月 31日 星期一 18:24:44 JST C array[2] is ja_JP.utf8 2011年 1月 31日 月曜日 18:24:44 JST eval echo "C array[$i] is \${C[$i]}" の変数が評価され、 evalを使用しないサンプルスクリプト †#!/bin/bash for i in 0 1 2 do C=(C zh_CN.utf8 ja_JP.utf8) echo "C array[$i] is \${C[$i]}" LANG=${C[$i]} date done evalを使用しないサンプルスクリプトの結果 †下記の結果の通り、${C[番号]}までは評価されますがevalを使っていないのでそのまま表示されます。 C array[0] is ${C[0]} Mon Jan 31 18:22:37 JST 2011 C array[1] is ${C[1]} 2011年 01月 31日 星期一 18:22:37 JST C array[2] is ${C[2]} 2011年 1月 31日 月曜日 18:22:37 JST |