私が次のようにした場合:
IFS=,
x=hello,hi,world
echo $x
その後、3つのパラメータ(およびそれぞれhello
)が抽出され、に渡されます。hi
world
echo
ただし、変数を使用しない場合は次のようになります。
IFS=,
echo hello,hi,world bye
その後、単語の分割はカンマ区切り文字の代わりにスペース区切り文字を使用して実行されるため、生成され渡される2つの引数はecho
となります。hello,hi,world
bye
変数を使用せずに単語分割にスペース以外の区切り文字を使用する方法はありますか?
答え1
いいえ、トークン化はコマンドライン(最新のシェルなど)から直接提供されるのではなく、拡張後にのみ発生します。これPOSIXのテキスト説明する:
2.6.5 フィールド分割
パラメータ拡張(Parameter Expansion)、コマンド置換(Command Substitution)、算術拡張(Arithmetic Expansion)の後、シェルは拡張および代替結果をスキャンする必要があります。これは、フィールドで区切られた二重引用符内では発生せず、複数のフィールドが発生する可能性があります。
(強調は私のもの)
そして吹く:
シェルは、単語分割のために二重引用符内に表示されない引数拡張、コマンド置換、および算術拡張の結果をスキャンします。
文字列がスクリプトに直接ある場合は、カンマをスペースに置き換えることができるので、何が問題なのかわかりません。外部から来ると、通常、コマンドの置き換えや使用read
などによって自然に分割が発生します。
もともとBourneシェルでは動作が少し異なりました。おめでとうございます この議論された他の質問への回答すぐに戻ってください。
答え2
コマンドラインの最初の分割はメタ文字で行われます。
メタ文字が
引用されていない場合に単語を区切るために使用される文字。次のいずれか
: &()<>スペースタブの改行
これは拡張前、噴射前(拡張後)です。
これはIFS値に関係なく発生します。
カンマはメタ文字ではないため、(最初は)行は分割されません。