トップ > Linuxらしい使い方を覚える >
evalを使って動的にコマンドを組み立てることができる

  

滅多に使わない eval コマンドは何が便利なのか

この記事で紹介するのは eval(イーバル) イーバル eval(イーバル) と呼ばれるシェルの機能です。 eval はシェルに組み込まれている組み込みコマンド(ビルトインコマンド)です。

なお eval コマンドはセキュリティ上のリスクになり得るため、筆者は滅多に使うことがありません

eval コマンドは、与えられたテキストをコマンドとしてシェルに実行させるための機能です。 eval コマンドが役立つ場面として思いつくのは、

  1. コマンドの実行結果をさらにコマンドとして実行する
  2. 動的に変数を参照する

ぐらいでしょうか。 おそらく、みなさん使うことはないでしょう。

そのような事情もあって解説するのは気乗りしません。 でも、そういうわけにはいきませんので以下で解説することにします。

コマンドの実行結果をさらにコマンドとして実行する

まずは、コマンドの実行結果をさらにコマンドとして実行する例を紹介します。 ここでは、ファイルに書かれている内容をコマンドとして実行してみます。

最初にテキストファイルにコマンドを書き込みます。 それでは端末を開き、キーボードから echo 'echo 1 + 2 + 3 | bc' > commandfile と入力して、Enterキーを押してください。


echo 'echo 1 + 2 + 3 | bc' > commandfile

 

以下のように "echo 1 + 2 + 3 | bc" というテキストをファイル commandfile へ保存します。

taro@myhostname:~$ echo 'echo 1 + 2 + 3 | bc' > commandfile
taro@myhostname:~$

ファイル commanfile の中身を確認しておきましょう。 キーボードから cat commandfile と入力して、Enterキーを押してください。


cat commandfile

 

以下のように "echo 1 + 2 + 3 | bc" という内容が書き込まれていることが確認できます。

taro@myhostname:~$ cat commandfile
echo 1 + 2 + 3 | bc
taro@myhostname:~$

さあ、準備ができました。 ファイル commandfile に書かれている命令 "echo 1 + 2 + 3 | bc" を実行してみましょう。

キーボードから eval `cat commandfile` と入力して、Enterキーを押してください。


eval `cat commandfile`

 
  
cat commandfile を囲んでいるのは `(逆引用符) です。 つまり、コマンド置換の機能を使っています。

以下のように 6 と表示されます。 狙い通りの結果です。

taro@myhostname:~$ eval `cat commandfile`
6
taro@myhostname:~$

このようにファイルの内容をコマンドとして実行することができました。 なお、今回のコマンドの、

eval `cat commandfile`

は、まずはコマンド置換により、

eval echo 1 + 2 + 3 | bc

と解釈されます。 次に eval は、

echo 1 + 2 + 3 | bc

を実行します。 よって、結果は 6 となります。

動的に変数を参照する

次に紹介するのは、変数を動的に参照する例です。 利用者に数字を入力させ、それが 1 なら 変数 value1 の中身を、2 なら変数 value2 の中身を、3 なら 変数 value3 の中身を表示します。

まずは、変数 value1 と value2 と value3 を準備しましょう。 それぞれ、"one" "two" "three" を代入します。 キーボードから value1=one ; value2=two ; value3=three と入力して、Enterキーを押してください。


value1=one ; value2=two ; value3=three

 

以下のように変数 value1 / value2 / value3 に "one" / "two" / "three" を代入します。

taro@myhostname:~$ value1=one ; value2=two ; value3=three
taro@myhostname:~$

次に read コマンドを使ってキーボードからの入力を変数 choice に格納します。 キーボードから read choice と入力して、Enterキーを押してください。


read choice

 

以下のように入力待ちになります

taro@myhostname:~$ read choice
 

以下のように 2 と入力してEnterキーを押してください。 read コマンドが終了し、シェルプロンプトに戻ります。

taro@myhostname:~$ read choice
2
taro@myhostname:~$

変数 choice に 2 が格納されたことを一応確認しておきましょう。 キーボードから echo $choice と入力して、Enterキーを押してください。


echo $choice

 

以下のように 2 が格納されています。

taro@myhostname:~$ echo $choice
2
taro@myhostname:~$

いよいよ肝心の eval コマンドです。 キーボードから eval echo '$value'$choice と入力して、Enterキーを押してください。


eval echo '$value'$choice

 

以下のように "two" と表示されます。

taro@myhostname:~$ eval echo '$value'$choice
two
taro@myhostname:~$

このようにキーボードから入力した数字によって変数名を動的に作成することができます。 なお、今回のコマンドの、

eval echo '$value'$choice

は、まずは変数 choice の展開により、

eval echo $value2

と解釈されます。 '(引用符) で囲まれた変数は展開されないため $value は展開されていません。 次に eval は、

echo $value2

を実行します。 よって、結果は "two" となります。

  
  

まとめ

eval コマンドを使うことで、テキストをコマンドとしてシェルに実行させることができます。 eval コマンドが役立つ場面として思いつくのは、

  1. コマンドの実行結果をさらにコマンドとして実行する
  2. 動的に変数を参照する

などです。 なお、セキュリティ上のリスクがあるため eval コマンドは慎重に利用しましょう。

メニュー