
ここに私の小さな 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
split+globの対象となることを意図していない限り
コードを「変数」に保存するより良い方法は、関数を使用することです。
mycommand() { echo "$i"; }
(mycommand
の代わりにを使用しますcommand
。 はcommand
既に存在するコマンドです)。
が/ /$command
の場合、動作はシェルによって異なります。break
continue
return
もしあなた$command
が簡単なコマンドこれは単語のリストであり、その最初の単語が、単語のリストを引数として実行するコマンドとして検索されます。配列変数を使用します。
command=('echo' '$i' "$i")
"${command[@]}"
echo
これは、echo
、$i
および の内容を引数として を実行します$i
。
command='echo $i ;x /* '$i
$command
(デフォルト値は$IFS
)は、最も意味をなさないものです。 には$command
文字列が含まれます。最初の文字列は$i
そのまま残され、2番目の文字列は(一重引用符の外側にあるため)展開され、その後、その文字列は(二重引用符の内側にないため)分割+グロブの対象となり$command
、その結果、いくつかの単語が、簡単なコマンドまた。