シェル変数に格納したコマンドを実行したい!
ということがあり、はまってしまった・・・。
例えばこんなコマンドが、変数に入ってたとします。
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.'
が 'run
と a
と script.'
という引数として認識されてしまってます。
もちろん期待値は、こう。
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
常識?