IFSをnullに設定すると、先行スペースシーケンスは無視されません。

IFSをnullに設定すると、先行スペースシーケンスは無視されません。

マニュアルによると:

If IFS is unset, or its value
       is exactly <space><tab><newline>, the default, then sequences of
       <space>, <tab>, and <newline> at the beginning and end of the
       results of the previous expansions are ignored, and any sequence
       of IFS characters not at the beginning or end serves to delimit
       words.

そして:

If
       the value of IFS is null, no word splitting occurs.

ここで得られたのは、IFSが空の場合、トークン化が発生しないため、一連の先行スペース、タブ、および改行が無視されないことです。

このステートメントが正しい場合は、なぜ空白文字の代わりにIFS= echo sssssssssssssssXYZ印刷するのですか?XYZsssssssssssssssXYZs

パラメータ拡張、命令拡張、算術拡張結果にのみ影響を及ぼすためですか?

それでは、なぜ先行する空白文字をエコー印刷しないのですか?

答え1

多くの理由。

まず、トークン化はIFSコマンドライン(*)のテキストに直接適用されず、拡張結果にのみ適用されます。コマンドラインを単語に分割することは異なり、引用符のない連続したスペースはそこにあるスペースと同じです。では1つのパラメータを取得somecmd foo:barsomecmdますが、コロンまたはスペースを含めるsomecmd foo barかどうかにかかわらず、IFS2つのパラメータを取得します。では単一のパラメータを取得echo xyzします。echoxyz

次に、IFSコマンドラインで解析を開始する前に設定した値が重要です。設定var=foo:barして実行すると、まだ次のようになりますIFS=: printf "%s\n" $varprintf一つフォーマット文字列に従い、foo:bar1行に出力されるパラメータ。同じコマンドの変数設定は、そのコマンド内でのみ適用されます。~へそれを使用または使用printfしません。echoIFS

これを適用するには、前のコマンドを設定する必要がありますIFS。たとえば、これにより、2つの別々の行に合計が印刷されますfoo。これによりスペースが保存されます。barvar=foo:bar IFS=:; printf "%s\n" $varvar=" foo" IFS=:; printf "%s\n" $var

しかし、ほとんどの場合、拡張子を引用する方が良いでしょう。これにより、トークン化から結果が保護されます。そして値に関係なくワイルドカードですIFS

(* AFAIK一部の初期シェルでは、IFSコマンドラインから直接単語に対して機能しました。これを設定するとprintIFS=bになります。)echo foobarfoo ar

関連情報