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を利用すると意図した動作になります。
$ 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
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]}" の変数が評価され、
i=0の場合だと、eval echo "C array[0] is ${C[0]}"となり、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
下記の結果の通り、${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