bash手册中的一行是什么意思;将命令行拆分为字后,将在命令行上执行扩展;
我在读书, 它说它有7种扩展/替换类型,包括“分词”。 另一方面,它在项目的开头说: 将命令行拆分为单词后,将在命令行上执行展开 我不明白什么是“分裂成文字”。换言之,我无法理解“拆分为单词”和“将单词拆分视为扩展”之间的区别 请让我知道什么是“在命令行被拆分为单词后在命令行上执行的扩展” 这是否意味着,假设bash手册中的一行是什么意思;将命令行拆分为字后,将在命令行上执行扩展;,bash,Bash,我在读书, 它说它有7种扩展/替换类型,包括“分词”。 另一方面,它在项目的开头说: 将命令行拆分为单词后,将在命令行上执行展开 我不明白什么是“分裂成文字”。换言之,我无法理解“拆分为单词”和“将单词拆分视为扩展”之间的区别 请让我知道什么是“在命令行被拆分为单词后在命令行上执行的扩展” 这是否意味着,假设 $> var1="word splitting" $> var2="single_word" $> command var1 var2 “将命令行拆分为单词后,在命令行
$> var1="word splitting"
$> var2="single_word"
$> command var1 var2
“将命令行拆分为单词后,在命令行上执行扩展。”->解析单词
word1 = command
word2 = var1
word3 = var2
“分词”->按分隔符指定位置参数
$1 = "word"
$2 = "splitting"
$3 = "single_word"
非常感谢。这里有人比我更了解bash,但我会尝试一下 正如您所引用的,该手册描述了在执行任何其他操作之前,该命令被拆分为多个单词Edit:正如rici(感谢)指出的,命令行的解析规则与扩展后的分词规则不同。除其他差异外,不参考IFS变量,而是用空格或特殊字符(空格是制表符或空格)简单地分隔单词。有关示例,请参见下面的注释 然后执行所有其他扩展。那么 shell扫描参数扩展的结果,命令 替换和用于分词的算术展开[…] 本质上,它将其他扩展的结果视为一个新的命令行,只有少数例外
$> command $var1 $var2
(请注意,使用时必须在变量名称前加上美元符号)由于参数扩展而变为:
command word splitting single_word
(一个字符串、字母和空格)。此字符串(整行)再次拆分为明显的单词。第一个单词通常解释为命令,其他单词则成为命令的位置参数<代码>命令将看到
$1作为单词,$2作为拆分,$3作为单个单词
因此,以不同的方式执行两次分词:一次在原始命令行上,使用引号和其他特殊构造;在其他扩展的结果上,使用IFS变量,忽略引号等。顺便说一句,bash不会递归地对该结果执行其他扩展(也就是说,如果作为扩展结果的位置参数是一个类似“$var1”的字符串,则按字面理解,就像以单引号传递它一样).当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
然后,第三个标记(单词):单词拆分
将进行单词拆分,并成为两个标记(单词):单词
和拆分
(因为默认情况下IFS包含空格)
第四个标记也要进行分词(因为它没有引号),但仍然作为一个标记(单词),因为它没有IFS字符
请注意,“分词”通常与全局关联,因为两者都应用于无引号的扩展。通过命令
set-f
可以关闭全局搜索,使用引号可以避免分词。感谢fedorqui编辑上述问题。如果您不介意,请告诉我如何制作黄色单元格“Expansion~~~”,或者请告诉我您遵循的格式/规则和堆栈溢出编辑工具的位置。谢谢,你看。另外,如果你想提及某人,你需要在他/她的名字前面加上@
。所以我看到了这条评论,因为我再次输入了问题,但要得到通知,你应该说@fedorqui…
@fedoqui谢谢你给我的指导。非常感谢。如果你看到我之前的评论,请不要介意。我的意见没有多大意义。再次感谢您使用IFS
不会将命令解析为单词。标准中规定了精确的解析算法,并在shell手册中进行了记录。它识别引用字符和自定界字符,如代码>和)
。分词(严格基于IFS
)是完全不同的。重要的是不要混淆这两种截然不同的操作。@rici谢谢。下面的例子就是你的意思吗?我刚试过:a=\'ls \-l\;echo$a$一个
,结果是“ls-l”
,下一行:-bash:“ls:command not found
。与简单的“ls-l”
相反,它会导致-bash:ls-l:command not found
。区别在于“ls-l>时它是整个命令“
直接在命令行上给出,因为最初的命令解析尊重引号,而扩展$a
的结果只是在空格处拆分为单词,忽略引号,因此第一个单词就是”ls
@Charles我认为是dist