この基本的なbash forループでループ変数が理解されないのはなぜですか?

この基本的なbash forループでループ変数が理解されないのはなぜですか?
$ bash -c "for VAR in {0..9}; do echo $VAR; done;

引用符で囲まれた内容を正確に含むシェルスクリプトは、期待どおりに機能します。

結果は10本の空行です。この行をどのように編集しても(つまり、/bin/bash代わりに、、、または他の変数名を使用して)、ファイルに同じ結果が出力されます。shbash${VAR}"$VAR""${VAR}"

先に設定した変数名を でのみ使用すると、 $ VAR=11、10回出力されます。

私のユーザーにとって、両方とも.bash完全に正常に見えます。.bash_profileこれは私を狂わせていますが、非常に明確なものを見逃していますか?

答え1

次のコマンドを使用してデバッグをオンにすると、何が起こっているかを確認できますset -x

$ set -x
$ bash -c "for VAR in {0..9}; do echo $VAR; done;"
+ bash -c 'for VAR in {0..9}; do echo ; done;'

したがって、式の周囲に二重引用符を使用すると、-c対話型の親シェル拡張$VAR(空の文字列まで)が可能になります。一重引用符を使用すると、期待どおりに機能します。

bash -c 'for VAR in {0..9}; do echo $VAR; done;'

または脱出するには$

bash -c "for VAR in {0..9}; do echo \$VAR; done;"

関連情報