私には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
ループは、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.'
この孤立した例では大きな違いはありませんが、できるプロセスを回避することは、学ぶべき重要な考慮事項です。
$()
は、「最初にこれを評価し、次に残りの行を評価する」ことを意味します。
例:
echo $(pwd)/myFile.txt
として解釈されます
echo /my/path/myFile.txt
一方、${}
は変数を展開します。
例:
MY_VAR=toto
echo ${MY_VAR}/myFile.txt
として解釈されます
echo toto/myFile.txt
bash$ while ((i=0;i<10;i++)); do echo $i; done
として使用できないのはなぜですか
答えは、while
のbash構文がfor
の構文とまったく同じではないということです。