直接の答え

直接の答え

Bashでは、トークン化はコマンドライン処理の1つのステップです。 Bashマニュアルから

シェルは$ IFSの各文字を区切り文字として扱い、これらの文字をフィールドの終端として使用して、他の拡張結果を単語に分割します。 IFSが設定されていない<space><tab><newline>場合、またはその値がデフォルト値の場合、前の <space>, <tab>, and <newline>拡張結果の始まりと終わりのシーケンスは無視され、始まりまたは終わりにないIFS文字シーケンスは単語を区切るために使用されます。 IFSにデフォルト以外の値がある場合、スペース文字がIFS値(IFSスペース)にある限り、単語の先頭と末尾のスペースとタブのシーケンスは無視されます。 IFS スペースではなく、IFS のすべての文字と隣接する IFS スペース文字が一緒にフィールドを区別します。空白文字の IFS シーケンスも区切り文字と見なされます。 IFS値が空の場合、単語分割は発生しません。

spaceパラメータ間の区切り文字がまたはで置き換えられるように、次の例を書き直したいと思いますabctabnewline

$ echo a b c
a b c

しかし、ボタンを押してもTab何も起こりません。

をクリックすると、\出力に、との間にスペースがありませんreturnabc

$ echo a\
> b\
> c
abc

なぜ引用文で言うようにできないのですか?

しかし、何の結果も出ません$IFS

$ echo $IFS

ベストアンサー1

bash改行文字は値に関係なく特別に処理されますIFS。改行前のバックスラッシュにより改行が発生します。無視される。これは、単語の分割に関係なく、IFS一部のカスタム値に設定されている場合にも発生します。

からLESS=+/^QUOTING man bash

   A  non-quoted  backslash (\) is the escape character.  It preserves the
   literal value of the next character that follows, with the exception of
   <newline>.   If  a  \<newline>  pair  appears, and the backslash is not
   itself quoted, the \<newline> is treated as a line  continuation  (that
   is, it is removed from the input stream and effectively ignored).

改行文字で単語分割が異なる方法で発生することがわかります。つまり、改行文字を変数に入れてから、引用しないでecho変数を参照します。

$ myvar=a$'\n'b$'\n'c
$ echo "$myvar"
a
b
c
$ echo $myvar
a b c
$ 

おすすめ記事