bashで変数の中のコマンドを実行

シェル変数に格納したコマンドを実行したい!
ということがあり、はまってしまった・・・。

例えばこんなコマンドが、変数に入ってたとします。

script="sh func.sh run a script."

ちなみに func.sh はこんなコード。

#!/bin/bash

echo $*

この変数に入った func.sh は、以下のように記述することで実行可能。

#
# sh sample.sh
#
script="sh func.sh run a script."

${script}

`echo ${script}`

$(echo ${script})

常識。

でもこれだと、こんなパターンでうまくいかない。

script="sh func.sh 'run a script.'"

なにがうまくいかないって、先ほどの func.sh を以下のように変更。

#!/bin/bash

echo $*
echo $#

これを実行すると、

sh sample.sh
  # 'run a script.'
  # 3
  # 'run a script.'
  # 3
  # 'run a script.'
  # 3

となる。

'run a script.''runascript.' という引数として認識されてしまってます。

もちろん期待値は、こう。

sh func.sh 'run a script.'
  # run a script.
  # 1

これを期待値どおりに実行したい場合には、eval コマンド使って実行。

#
# sh sample.sh
#
script="sh func.sh 'run a script.'"

eval ${script}

これだと、以下のように期待通りの結果が得られました。

sh sample.sh
  # run a script.
  # 1

常識?