user267935 Asked: 2017-12-31 02:45:22 +0800 CST2017-12-31 02:45:22 +0800 CST 2017-12-31 02:45:22 +0800 CST 有没有办法在不使用变量时使用非空格分隔符进行分词? 772 如果我做这样的事情: IFS=, x=hello,hi,world echo $x 然后将提取三个参数(分别是helloandhi和world),并将这三个参数传递给echo. 但是当我不使用变量时: IFS=, echo hello,hi,world bye 然后将使用空格分隔符而不是逗号分隔符进行分词,因此生成并传递给的两个参数echo将是hello,hi,worldand bye。 有没有办法在不使用变量时使用非空格分隔符进行分词? bash shell 2 个回答 Voted Best Answer ilkkachu 2017-12-31T02:50:26+08:002017-12-31T02:50:26+08:00 不,分词只发生在扩展之后,而不是直接在命令行上给出的东西(即在现代 shell 上)。POSIX 中的文字说: 2.6.5 字段拆分 在参数展开(Parameter Expansion)、命令替换(Command Substitution)和算术展开(Arithmetic Expansion)之后,shell会扫描双引号中没有出现的展开和替换的结果进行字段拆分和可以产生多个字段。 (强调我的) 和重击: shell 会扫描双引号内未出现的参数扩展、命令替换和算术扩展的结果以进行分词。 我不确定这是否有很大的问题,因为如果字符串直接在脚本中,您可以用空格替换逗号。如果它来自外部,那么拆分通常会自然发生,在命令替换或使用read时等。 在最初的 Bourne shell 中,行为有点不同,@Stéphane Chazelas 不久前在另一个问题的回答中 讨论了这个问题 user232326 2017-12-31T06:17:34+08:002017-12-31T06:17:34+08:00 命令行的第一次拆分是在元字符上完成的: 元 字符 不加引号时分隔单词的字符。以下之一: | &; ( ) < > 空格制表符换行 那是在任何扩展之前,在任何分词之前(在扩展之后)。 无论 IFS 的值如何,都会发生这种情况。 逗号不是元字符,因此(最初)不会在其上分割一行。
不,分词只发生在扩展之后,而不是直接在命令行上给出的东西(即在现代 shell 上)。POSIX 中的文字说:
(强调我的)
和重击:
我不确定这是否有很大的问题,因为如果字符串直接在脚本中,您可以用空格替换逗号。如果它来自外部,那么拆分通常会自然发生,在命令替换或使用
read
时等。在最初的 Bourne shell 中,行为有点不同,@Stéphane Chazelas 不久前在另一个问题的回答中 讨论了这个问题
命令行的第一次拆分是在元字符上完成的:
那是在任何扩展之前,在任何分词之前(在扩展之后)。
无论 IFS 的值如何,都会发生这种情况。
逗号不是元字符,因此(最初)不会在其上分割一行。