この記事で紹介するのは
なお eval コマンドはセキュリティ上のリスクになり得るため、筆者は滅多に使うことがありません。
eval コマンドは、与えられたテキストをコマンドとしてシェルに実行させるための機能です。 eval コマンドが役立つ場面として思いつくのは、
ぐらいでしょうか。 おそらく、みなさん使うことはないでしょう。
そのような事情もあって解説するのは気乗りしません。 でも、そういうわけにはいきませんので以下で解説することにします。
まずは、コマンドの実行結果をさらにコマンドとして実行する例を紹介します。 ここでは、ファイルに書かれている内容をコマンドとして実行してみます。
最初にテキストファイルにコマンドを書き込みます。 それでは端末を開き、キーボードから 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`
以下のように 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 コマンドが役立つ場面として思いつくのは、
などです。 なお、セキュリティ上のリスクがあるため eval コマンドは慎重に利用しましょう。