【使用例紹介】文字列の内容をコマンドとして解釈し実行する(eval)【シェルスクリプト】

雑学

備忘録です。evalを使った文字列の内容をコマンドとして解釈し実行する方法になります。

基本的な使い方

# cat wrk.sh
VAR_A='111'
VAR_B='echo $VAR_A'
eval $VAR_B

# ./wrk.sh
111

# bash -x ./wrk.sh
+ VAR_A=111
+ VAR_B='echo $VAR_A'
+ eval echo '$VAR_A'
++ echo 111
111

注意点

evalに渡す値に変数を含む場合は注意が必要です。シェルスクリプト全般に言える事ですが、まず変数が展開されてからコマンド(eval)が実行されます。以下、例を挙げます。

# cat wrk.sh
VAR_A='111'
VAR_B='$VAR_A'
VAR_C='$VAR_B'
eval echo $VAR_C

# ./wrk.sh
$VAR_A

# bash -x wrk.sh
+ VAR_A=111
+ VAR_B='$VAR_A'
+ VAR_C='$VAR_B'
+ eval echo '$VAR_B'
++ echo '$VAR_A'
$VAR_A

まず一般的なコマンドとして変数部分が展開され、そこでevalに変数が渡された場合は再度変数展開されます。結果的に変数が再帰的に2回まで展開されます。
ちなみに以下のような渡し方をすれば無限再帰的な変数展開されます。

# cat ./wrk.sh
VAR_A='eval echo 111'
VAR_B='eval $VAR_A'
VAR_C='eval $VAR_B'
eval 'eval $VAR_C'

# ./wrk.sh
111

# bash -x ./wrk.sh
+ VAR_A='eval echo 111'
+ VAR_B='eval $VAR_A'
+ VAR_C='eval $VAR_B'
+ eval 'eval $VAR_C'
++ eval eval '$VAR_B'
+++ eval eval '$VAR_A'
++++ eval eval echo 111
+++++ eval echo 111
++++++ echo 111
111

関連リンク