bashで値を含む文字列をコマンドとして実行するには?

bashで値を含む文字列をコマンドとして実行するには?

ここに私のbashスクリプトの小さな部分があります。

i=5
command='echo $i'
$command

このスクリプトを印刷したいです5。つまり、echoを実行して5を印刷したいのです。ただし、引き続き印刷されます$i。それでは、この問題をどのように解決するのですか?

答え1

それは次のとおりです。

eval "$command"

コンテンツを$commandシェルコードとして評価する場合。

$command起動しないことを保証できない場合-(これによりeval一部のシェルではbashオプションとして扱われます)、次のことを実行できます。

eval " $command"

代わりに。追加の先行スペースは、コマンドの構文解析方法に影響を与えず、コマンドが 。で終わる$commandと、一部のシェル(.を含む)では機能しますが、POSIX(IIRC)ではなく、Bourneシェルでは機能しません。eval-eval -- "$command"bashdash

おそらく次のよう$commandになります。

command='echo "$i"'

$i実際に分割+グローブを使用する予定がない場合

「変数」にコードを保存するより良い方法は、関数を使用することです。

mycommand() { echo "$i"; }

(すでに既存のコマンドなので、mycommand代わりに使用してください。)commandcommand

$command//breakの場合、動作continuereturnシェルによって異なります。

$command保存したい場合簡単なコマンド、最初の単語が単語リストを引数として使用して実行されるコマンドで検索される単語のリストである場合は、配列変数を使用できます。

command=('echo' '$i' "$i")
"${command[@]}"

これはrunの内容を引数として使用しますechoecho$i$i

command='echo $i ;x /* '$i
$command

(デフォルトは$IFS)は最も意味がありません。そこには$command文字列が含まれます。最初のものは$iそのまま残り、2番目のものは拡張されます(一重引用符の外側のように)。その後、文字列は分割+globの影響を受けます($command二重引用符内にないため)。その結果は多くの言葉になります。一つとして受け入れた簡単なコマンド再び。

関連情報