我正在读关于“扩展”的巴什手册,它说它有7种类型的扩展/替代,包括“分词”。另一方面,它在该项目的开头说:
扩展是在命令行被拆分成单词之后执行的。
我不明白什么是“分词”。换句话说,我不明白“分词”和“分词算作扩展”之间的区别。
请让我知道什么是“扩展执行后,命令行已被分割成文字”。意思是。
这是否意味着,假设
$> var1="word splitting"
$> var2="single_word"
$> command var1 var2“扩展是在命令行拆分成单词之后执行的。”->解析单词。
word1 = command
word2 = var1
word3 = var2“分词”->用定界符指定位置参数
$1 = "word"
$2 = "splitting"
$3 = "single_word"非常感谢。
发布于 2016-08-25 14:32:46
当bash手册声明如下:
扩展是在命令行被拆分成单词之后执行的。
这意味着命令行从一个字符串开始,然后从左到右在元字符上拆分该字符串:
元字符 不加引号的字符,当没有引文时,将单词分开。下列之一: @&;()<>空格标签
这种分裂的结果被称为“单词”或“记号”。
它应用于整个命令行字符串。
相反,所谓的“分词”仅适用于“未引号扩展”的结果,并且只使用$IFS中的字符进行拆分。
因此,此命令行只打印两行:
$ a="word splitting" b="single_word"
$ printf '%s\n' "$a" "$b"
word splitting
single_word命令行:printf '%s\n' "$a" "$b"被空格划分为四个标记(words):
一:printf,二:'%s\n'三:"$a",四:"$b"。
如果没有引用相同的命令行:
$ printf '%s\n' $a $b
word
splitting
single_word然后,第三个令牌( word ):word splitting受单词拆分的限制,成为两个令牌(单词):word和splitting (因为IFS默认包含一个空格)。
第四个令牌也受分词(因为它没有引号),但仍然作为一个令牌( word ),因为它没有IFS字符。
请注意,“分词”通常与全局关联,因为两者都适用于未引号的扩展。set -f命令可以关闭Globing,使用引用可以避免分字。
发布于 2016-08-25 10:06:59
这里有些人比我更了解巴什,但我会试一试。
正如您所引用的,手册描述了在完成任何其他操作之前,命令会被拆分成单词。编辑:(谢谢)指出,命令行的解析规则与扩展后的单词拆分不同。在其他区别中,不参考IFS变量,而是用空格或特殊字符分隔单词(空格是制表符或空格)。有关示例,请参见下面的注释。
然后执行所有其他扩展。然后,
shell扫描参数展开、命令替换和算术扩展的结果。为了分词。
本质上,它将其他扩展的结果作为一个新的命令行来处理,只有少数例外。
$> command $var1 $var2(注意,在使用时必须在变量名前加上美元符号),这是由于参数展开:
command word splitting single_word(一个字符串、字母和空格)。这个字符串(整行)再次被分割成明显的单词。第一个词通常被解释为一个命令,其他的则成为命令的位置参数。command将把1美元视为word,2美元视为拆分,3美元视为single_word。
因此,分词两次,以不同的方式执行:一次在原始命令行上,尊重引号和其他特殊构造;一次在其他扩展的结果上,使用IFS变量、忽略引号等,bash不递归地对该结果执行其他扩展(也就是说,如果由于展开而产生的位置参数是一个字符串,如"$var1",则按字面方式将其传递到单引号中)。
https://stackoverflow.com/questions/39141699
复制相似问题