有没有办法在不使用变量时使用非空格分隔符进行分词?

有没有办法在不使用变量时使用非空格分隔符进行分词?

如果我做这样的事情:

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

然后将提取三个参数(分别是hello和),并将这三个参数传递给。hiworldecho

但是当我不使用变量时:

IFS=,
echo hello,hi,world bye

然后将使用空格分隔符而不是逗号分隔符进行分词,因此生成并传递给的两个参数echo将是hello,hi,worldand bye

有没有办法在不使用变量时使用非空格分隔符进行分词?

答案1

不,分词仅在扩展之后发生,而不是在命令行上直接给出的内容上发生(即在现代 shell 上)。这POSIX 中的文本说:

2.6.5 字段分割
经过参数扩展(Parameter Expansion)、命令替换(Command Substitution)、算术扩展(Arithmetic Expansion)后,shell 应扫描扩展和替换的结果这在字段分割的双引号中不会发生,并且可能会导致多个字段。

(强调我的)

重击:

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。

我不确定这有什么问题,因为如果字符串直接在脚本中,您可以将逗号替换为空格。如果它来自外部,那么分割通常会自然发生,在命令替换或使用read等时。


在最初的 Bourne shell 中,行为有点不同,@斯特凡·查泽拉斯 对此进行了讨论对另一个问题的回答一会儿回来

答案2

命令行的第一次分割是在元字符上完成的:

元字符
未加引号时用于分隔单词的字符。以下之一:
| &; ( ) < > 空格 制表符 换行符

这是在任何扩展之前、任何分词之前(扩展之后)。
无论 IFS 的值如何,都会发生这种情况。

逗号不是元字符,因此(最初)不会在其上分割行。

相关内容