変数を使用せずに単語分割にスペース以外の区切り文字を使用する方法はありますか?

変数を使用せずに単語分割にスペース以外の区切り文字を使用する方法はありますか?

私が次のようにした場合:

IFS=,
x=hello,hi,world
echo $x

その後、3つのパラメータ(およびそれぞれhello)が抽出され、に渡されます。hiworldecho

ただし、変数を使用しない場合は次のようになります。

IFS=,
echo hello,hi,world bye

その後、単語の分割はカンマ区切り文字の代わりにスペース区切り文字を使用して実行されるため、生成され渡される2つの引数はechoとなります。hello,hi,worldbye

変数を使用せずに単語分割にスペース以外の区切り文字を使用する方法はありますか?

答え1

いいえ、トークン化はコマンドライン(最新のシェルなど)から直接提供されるのではなく、拡張後にのみ発生します。これPOSIXのテキスト説明する:

2.6.5 フィールド分割
パラメータ拡張(Parameter Expansion)、コマンド置換(Command Substitution)、算術拡張(Arithmetic Expansion)の後、シェルは拡張および代替結果をスキャンする必要があります。これは、フィールドで区切られた二重引用符内では発生せず、複数のフィールドが発生する可能性があります。

(強調は私のもの)

そして吹く:

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

文字列がスクリプトに直接ある場合は、カンマをスペースに置き換えることができるので、何が問題なのかわかりません。外部から来ると、通常、コマンドの置き換えや使用readなどによって自然に分割が発生します。


もともとBourneシェルでは動作が少し異なりました。おめでとうございます この議論された他の質問への回答すぐに戻ってください。

答え2

コマンドラインの最初の分割はメタ文字で行われます。

メタ文字が
引用されていない場合に単語を区切るために使用される文字。次のいずれか
: &()<>スペースタブの改行

これは拡張前、噴射前(拡張後)です。
これはIFS値に関係なく発生します。

カンマはメタ文字ではないため、(最初は)行は分割されません。

関連情報