このエントリーをはてなブックマークに追加


文字列をコマンドとして実行する・evalコマンド

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は変数を評価後、引数の文字列をコマンドとして実行します。

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]}" の変数が評価され、
i=0の場合だと、eval echo "C array[0] is ${C[0]}"となり、evalに渡され実行されるので上記の結果になります。

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
 

 

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:27:16