ここに私の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"
bash
dash
おそらく次のよう$command
になります。
command='echo "$i"'
$i
実際に分割+グローブを使用する予定がない場合
「変数」にコードを保存するより良い方法は、関数を使用することです。
mycommand() { echo "$i"; }
(すでに既存のコマンドなので、mycommand
代わりに使用してください。)command
command
$command
//break
の場合、動作continue
はreturn
シェルによって異なります。
$command
保存したい場合簡単なコマンド、最初の単語が単語リストを引数として使用して実行されるコマンドで検索される単語のリストである場合は、配列変数を使用できます。
command=('echo' '$i' "$i")
"${command[@]}"
これはrunの内容を引数として使用しますecho
。echo
$i
$i
command='echo $i ;x /* '$i
$command
(デフォルトは$IFS
)は最も意味がありません。そこには$command
文字列が含まれます。最初のものは$i
そのまま残り、2番目のものは拡張されます(一重引用符の外側のように)。その後、文字列は分割+globの影響を受けます($command
二重引用符内にないため)。その結果は多くの言葉になります。一つとして受け入れた簡単なコマンド再び。