我正在阅读bash manual on "Expansion", 它说它有7种类型的扩展/替换,包括"分词"。 另一方面,它在项目的头部说:
扩展在分割为单词后在命令行上执行。
我无法理解什么是"分成单词"。换句话说,我无法理解"分成单词"和"单词拆分算作扩展"。
请告诉我"扩展是在命令行分割为单词后执行的。"装置
是否意味着,假设
$> var1="word splitting"
$> var2="single_word"
$> command var1 var2
"在将命令行拆分为单词后,在命令行上执行扩展。" - >解析单词
word1 = command
word2 = var1
word3 = var2
"单词分裂" - >通过分隔符
分配位置参数$1 = "word"
$2 = "splitting"
$3 = "single_word"
非常感谢。
答案 0 :(得分:1)
这里的人比我更了解bash,但我会试一试。
正如您所引用的那样,该手册描述了在完成任何其他操作之前,该命令被拆分为单词。 编辑:正如rici(感谢)指出的那样,命令行的解析规则与扩展后的单词拆分不同。除了其他差异之外,不会查询IFS变量,而是简单地用空格或特殊字符(空格是制表符或空格)分隔单词。请参阅以下评论以获取示例。
然后执行所有其他扩展。然后,
shell扫描参数扩展命令的结果 用于分词的替换和算术扩展。
基本上,它将其他扩展的结果视为新的命令行,但有一些例外。
$> command $var1 $var2
由于参数扩展,(请注意,在使用时必须在变量名前加上美元符号):
command word splitting single_word
(一个字符串,字母和空格)。这个字符串(整行)再次分成了明显的单词。第一个单词通常被解释为命令,其他单词成为命令的位置参数。 command
会看到
$ 1为 word ,$ 2为拆分,$ 3为 single_word 。
因此,单词拆分以不同的方式执行两次:一次在原始命令行上,尊重引号和其他特殊结构;并且一旦在其他扩展的结果上,使用IFS变量,忽略引号等。顺便说一句,bash不会递归地执行该结果的其他扩展(也就是说,如果作为扩展的结果的位置参数是字符串如“$ var1”,字面意思,就好像用单引号传递一样。)
答案 1 :(得分:1)
当bash手册说明:
扩展在分割为单词后在命令行上执行。
这意味着命令行作为整个字符串开始,然后,从左到右,该字符串在元字符上分割:
元字符
一个字符,当不加引号时,分隔单词。以下之一:
| &安培; ; ()< >空格标签
这种分裂的结果被称为"单词"或者"令牌"。
这适用于整个命令行字符串。
相比之下,所谓的"单词分裂"仅适用于未引用扩展的结果"并仅使用$IFS
中的字符进行拆分。
因此,此命令行只打印两行:
$ a="word splitting" b="single_word"
$ printf '%s\n' "$a" "$b"
word splitting
single_word
命令行:printf '%s\n' "$a" "$b"
被空格分成四个标记(单词):
一个:printf
,两个:'%s\n'
三个:"$a"
和四个:"$b"
。
如果同一命令行不加引号:
$ printf '%s\n' $a $b
word
splitting
single_word
然后,第三个标记(单词):word splitting
受到单词拆分的影响,变成两个标记(单词):word
和splitting
(因为IFS默认包含一个空格)
第四个令牌也受到分词(因为它没有引用),但仍然是一个令牌(单词),因为它没有IFS字符。
请注意"单词拆分"通常与globing有关,因为两者都适用于不带引号的扩展。可以通过命令set -f
关闭Globing,并且可以通过引用来避免分词。