Ubuntu 20.04でBash 5.0.17を使用しています。
フォローアップです。この問題。質問する前に、IFS
それがどのように機能するかを理解したと思いましたが、今は完全に混乱して一連の質問があります。
- 静的文字列とはどういう意味ですか?
- セグメンテーションと拡張の違いは何ですか?
- このサイトのどこかで変数(*)を引用することをお勧めすることを読んでいますが、時には別の結果が得られます。たとえば、次のようになります。
IFS=":"; for i in 1:2:3; do echo $i; done # output: 1 2 3
IFS=":"; for i in 1:2:3; do echo "$i"; done # output: 1:2:3
# Why do the quotes make a difference between the two commands?
これらの質問が愚かだと思われる場合は無視してください。この混乱を解決することに興味がある人がいる場合は、その人の助けに本当に感謝します。
ありがとう
編集する:以下のリンクを追加しました
(*) : 私は次の2つの答えに言及しています。
ベストアンサー1
あなたのfor
-loopはあなたが思うように機能しません。
IFS=":"; for i in 1:2:3; do ...
$i
文字通り、1:2:3
ループは一度だけ実行されます。
IFS
変数拡張を使用するか、コマンドの特殊変数を使用して単語を分割しますread
。
これはあなたの質問に対する答えでもあります。
を実行すると、IFS=:; i=1:2:3; echo $i;
拡張(および単語分割)は最後のコマンドでのみ発生し、「単語」(1、2、3)は別々にエコーされます - > 1 2 3
。 (@ikkachuがすでに彼の答えで言ったように、これがうまくいくecho
方法です)。
引用符を追加すると、$i
単語の区切りが防止され、echo
変数が文字通り出力されます(1:2:3
)。
for
この知識を使用して、変数拡張を介してループを変更することもできます。
IFS=:; var=1:2:3; for i in $var; do echo $i; done
以下を出力します。
1
2
3