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
答え2
私の質問に対する答えを見つけたようです。 (最後の2つの質問に対する答えは次のとおりです。Webページ)。
1. 静的文字列とは何ですか?
正確な表現ではありません。しかし、私はそれが「文字通り」文字列を意味すると思います。
2. 拡張とセグメンテーションの違いは何ですか?
$
拡張とは、中括弧拡張、チルダ拡張、シェルパラメータ、および変数拡張(記号の使用を含む)、コマンド置換、算術拡張、およびプロシージャ置換を意味します。噴射とファイル名拡張子。
したがって、単語の分割は、上記のWebページを引用して拡張の特別なケースです。
シェルは、単語分割のために二重引用符内に表示されない引数拡張、コマンド置換、および算術拡張の結果をスキャンします。
シェルは$ IFSの各文字を区切り文字として扱い、他の拡張結果をこれらの文字の単語に分割します。 IFS が設定されていない場合、またはその値がデフォルト値 "''" の場合は、IFS 文字シーケンスを使用して単語を区切ることができます。 IFS値がデフォルト値ではない場合、スペース文字がIFS値内にある限り、単語の先頭と末尾のスペース文字の「スペース」と「タブ」シーケンスは無視されます(IFSスペース機能)。 。 IFS スペースではなく、IFS 内のすべての文字と隣接する IF スペース文字が一緒にフィールドを区別します。空白文字の IFS シーケンスも区切り文字と見なされます。 IFS値が空の場合、単語分割は発生しません。
明示的に空のパラメーター ("""" または "''") は保持されます。値のないパラメータ拡張により、暗黙的に引用されていないNULLパラメータは削除されます。値のないパラメータを二重引用符で拡張すると、空のパラメータが生成され保持されます。
しかし、覚えておくべき重要な点は次のとおりです。