1. ホーム
  2. linux

[解決済み] Bashの${}と$()の違いについて [重複].

2022-05-11 05:34:08

質問

2つの質問があり、それらを理解するためにいくつかの助けを必要としています。

  1. の違いは何ですか? ${}$() ? というのはわかるのですが () は、別のシェルでコマンドを実行し $ は変数に値を渡すことを意味します。 変数に値を渡すことを意味します。このことを理解するために、どなたか私を助けていただけませんか? を理解できますか?私が間違っている場合、私を修正してください。

  2. もし私たちが for ((i=0;i<10;i++)); do echo $i; done でうまくいくのなら、なぜそれを while ((i=0;i<10;i++)); do echo $i; done ? 両者の実行サイクルの違いは何ですか?

どのように解決するのですか?

構文はトークンレベルなので、ドル記号の意味はそれが入っているトークンに依存します。例えば $(command) は現代の同義語で `command` の現代的な同義語で、コマンドの代入を意味します。 command を実行し、その出力をここに置くことを意味します。つまり

echo "Today is $(date). A fine day."

を実行すると date コマンドを実行し、その出力を echo . 括弧は、サブシェルでコマンドを実行する構文とは無関係ですが、共通点があります (コマンドの置換も別のサブシェルで実行されます)。

これに対して ${variable} は単なる曖昧さ回避のメカニズムなので、次のように言うことができます。 ${var}text の内容を意味するときに、変数 var の後に text (となります。 $vartext というのは、変数の内容が vartext ).

while ループは1つの引数を想定しており、trueかfalseと評価されます(実際には複数あり、最後の1つの真偽値が調べられます -- Jonathan Lefflerの指摘に感謝します)。偽の場合、ループはもう実行されません。 for ループは項目のリストを反復し、それぞれを順番にループ変数にバインドします。あなたが言及した構文は、算術値の範囲に対するループを表現する 1 つの(かなり一般化された)方法です。

A for のようなループは、次のように言い換えることができます。 while のループになります。このとき、式

for ((init; check; step)); do
    body
done

init
while check; do
    body
    step
done

ループ制御を一箇所にまとめるのは読みやすさの点から理にかなっていますが、このように表現するとわかるように、ループ制御を行うための for ループの方が while ループよりもかなり多くのことを行います。

もちろん、この構文は Bash 固有のもので、古典的な Bourne シェルでは

for variable in token1 token2 ...; do


(もう少しエレガントな方法としては echo が含まれていないことを確認する限り、最初の例では % のようなフォーマットコードがないことを確認してください。

date +'Today is %c. A fine day.'

この孤立した例では大きな違いはありませんが、可能な限りプロセスを避けることは重要な考慮点です)。