echoの出力が異なるのはなぜですか?

echoの出力が異なるのはなぜですか?

Ubuntu 20.04でBash 5.0.17を使用しています。

フォローアップです。この問題。質問する前に、IFSそれがどのように機能するかを理解したと思いましたが、今は完全に混乱して一連の質問があります。

  1. 静的文字列とはどういう意味ですか?
  2. セグメンテーションと拡張の違いは何ですか?
  3. このサイトのどこかで変数(*)を引用することをお勧めすることを読んでいますが、時には別の結果が得られます。たとえば、次のようになります。
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

答え2

私の質問に対する答えを見つけたようです。 (最後の2つの質問に対する答えは次のとおりです。Webページ)。

1. 静的文字列とは何ですか?

正確な表現ではありません。しかし、私はそれが「文字通り」文字列を意味すると思います。

2. 拡張とセグメンテーションの違いは何ですか?

$拡張とは、中括弧拡張、チルダ拡張、シェルパラメータ、および変数拡張(記号の使用を含む)、コマンド置換、算術拡張、およびプロシージャ置換を意味します。噴射とファイル名拡張子。

したがって、単語の分割は、上記のWebページを引用して拡張の特別なケースです。

シェルは、単語分割のために二重引用符内に表示されない引数拡張、コマンド置換、および算術拡張の結果をスキャンします。

シェルは$ IFSの各文字を区切り文字として扱い、他の拡張結果をこれらの文字の単語に分割します。 IFS が設定されていない場合、またはその値がデフォルト値 "''" の場合は、IFS 文字シーケンスを使用して単語を区切ることができます。 IFS値がデフォルト値ではない場合、スペース文字がIFS値内にある限り、単語の先頭と末尾のスペース文字の「スペース」と「タブ」シーケンスは無視されます(IFSスペース機能)。 。 IFS スペースではなく、IFS 内のすべての文字と隣接する IF スペース文字が一緒にフィールドを区別します。空白文字の IFS シーケンスも区切り文字と見なされます。 IFS値が空の場合、単語分割は発生しません。

明示的に空のパラメーター ("""" または "''") は保持されます。値のないパラメータ拡張により、暗黙的に引用されていないNULLパラメータは削除されます。値のないパラメータを二重引用符で拡張すると、空のパラメータが生成され保持されます。

しかし、覚えておくべき重要な点は次のとおりです。

関連情報