web-dev-qa-db-ja.com

Bashの$ {}と$()の違い

私には2つの質問があり、それらを理解するのにいくつかの助けを使うことができます。

  1. ${}$()の違いは何ですか? ()は別のシェルでコマンドを実行し、$を配置することは値を変数に渡すことを意味することを理解しています。誰かがこれを理解するのを手伝ってくれますか?私が間違っている場合は修正してください。

  2. for ((i=0;i<10;i++)); do echo $i; doneを使用でき、それが正常に機能する場合、なぜそれをwhile ((i=0;i<10;i++)); do echo $i; doneとして使用できないのですか?両方の実行サイクルの違いは何ですか?

64
Anaadih.pradeep

構文はトークンレベルであるため、ドル記号の意味はトークンに依存します。式$(command)は、コマンド置換を表す`command`の現代の同義語です。つまり、commandを実行し、その出力をここに配置します。そう

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

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

対照的に、${variable}は曖昧さ回避メカニズムにすぎないため、${var}textと言うことができます。つまり、変数varの内容にtext$vartextは、変数の内容vartextを意味します。

whileループは、trueまたはfalse(または実際には複数、最後の真理値が調べられる場合は複数)に評価される単一の引数を予期します。これを指摘してくれたJonathan Lefflerに感謝します。 falseの場合、ループは実行されなくなります。 forループは、アイテムのリストを反復処理し、それぞれを順番にループ変数にバインドします。参照する構文は、算術値の範囲でループを表現するための1つの(かなり一般化された)方法です。

そのようなforループは、whileループと言い換えることができます。表現

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

と同等です

init
while check; do
    body
    step
done

読みやすくするために、すべてのループ制御を1か所に保持することは理にかなっています。しかし、このように表現されていることがわかるように、forループはwhileループよりもかなり多くのことを行います。

もちろん、この構文はBash固有です。クラシックボーンシェルには

for variable in token1 token2 ...; do

(多少エレガントですが、引数文字列に%形式コードが含まれていないことが確実である限り、最初の例のechoを避けることができます。

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

この孤立した例では大きな違いはありませんが、できるプロセスを回避することは、学ぶべき重要な考慮事項です。

110
tripleee
  1. $()は、「最初にこれを評価し、次に残りの行を評価する」ことを意味します。

    例:

    echo $(pwd)/myFile.txt
    

    として解釈されます

    echo /my/path/myFile.txt
    

    一方、${}は変数を展開します。

    例:

    MY_VAR=toto
    echo ${MY_VAR}/myFile.txt
    

    として解釈されます

    echo toto/myFile.txt
    
  2. bash$ while ((i=0;i<10;i++)); do echo $i; doneとして使用できないのはなぜですか

    答えは、whileのbash構文がforの構文とまったく同じではないということです。

43
gturri