如果我做这样的事情:
IFS=,
x=hello,hi,world
echo $x
然后将提取三个参数(分别是hello
和),并将这三个参数传递给。hi
world
echo
但是当我不使用变量时:
IFS=,
echo hello,hi,world bye
然后将使用空格分隔符而不是逗号分隔符进行分词,因此生成并传递给的两个参数echo
将是hello,hi,world
and bye
。
有没有办法在不使用变量时使用非空格分隔符进行分词?
答案1
不,分词仅在扩展之后发生,而不是在命令行上直接给出的内容上发生(即在现代 shell 上)。这POSIX 中的文本说:
2.6.5 字段分割
经过参数扩展(Parameter Expansion)、命令替换(Command Substitution)、算术扩展(Arithmetic Expansion)后,shell 应扫描扩展和替换的结果这在字段分割的双引号中不会发生,并且可能会导致多个字段。
(强调我的)
和重击:
shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。
我不确定这有什么问题,因为如果字符串直接在脚本中,您可以将逗号替换为空格。如果它来自外部,那么分割通常会自然发生,在命令替换或使用read
等时。
答案2
命令行的第一次分割是在元字符上完成的:
元字符
未加引号时用于分隔单词的字符。以下之一:
| &; ( ) < > 空格 制表符 换行符
这是在任何扩展之前、任何分词之前(扩展之后)。
无论 IFS 的值如何,都会发生这种情况。
逗号不是元字符,因此(最初)不会在其上分割行。