我不太清楚怎么去理解这个 -
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
比。
$ set -- '' '' ''
$ echo "|${*}|"
| |
$ echo "|${*// /}|"
| |
然而,当我上面的
$ IFS=
$echo "|${*// /}|"
||
什么是在第二组命令中出现问题后添加此?这是预期的结果吗?
我不太清楚怎么去理解这个 -
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
比。
$ set -- '' '' ''
$ echo "|${*}|"
| |
$ echo "|${*// /}|"
| |
然而,当我上面的
$ IFS=
$echo "|${*// /}|"
||
什么是在第二组命令中出现问题后添加此?这是预期的结果吗?
$ var=' '
$ echo "|${var}|"
| |
$ echo "|${var// /}|"
||
这里有由两个空间的简单的字符串。在两个管道字符之间展开时,会在管道之间看到两个空格。当您使用模式替换从变量的扩展中删除所有空格时,您会看到两个管道之间的空字符串。
$ set -- '' '' ''
首先,你每个前三个位置参数的设置为空字符串。您可以通过比较${1-foo}
与{$4-foo}
(显示参数(如果设置),但'foo'(如果未设置))的结果来观察这一点。
$ echo ${1-foo}
$ echo ${4-foo}
foo
所以我们可以看到,$1
设置,但空,而$4
未设置。
$ echo "|${*}|"
| |
接下来,我们看扩大引号内的特殊参数$*
,这是由所设置的位置参数,由参数IFS
的第一个字符分隔的一个字符串的结果。 IFS
默认情况下有一个空格作为其第一个参数,所以我们看到的是一个由3个空字符串组成的字符串,每个空字符串之间用空格隔开,它们只是一个由2个空格组成的单个字符串。
$ echo "|${*// /}|"
| |
当应用模式替换到$*
,取代被施加到所得到的参数是使用IFS
接合之前单独每个位置参数。由于位置参数已经为空,因此从它们移除空格会使其不变。所以你得到的结果与你自己扩展$*
的结果相同。
$ IFS=
$ echo "|${*// /}|"
||
这里的程序是相同的实施例2中,与现在IFS
是空字符串,而不是它的“”默认的重要区别。再一次,模式替换并没有做任何事情,因为没有空间可以从任何位置参数中移除。但是现在,扩展$*
会生成一个由位置参数组成的字符串,而不包含中间字符。而不是$1 $2 $3
,你得到$1$2$3
。由于所有三个都是空字符串,结果是空字符串。
谢谢。这解释了很多。 – Annjawn
没什么。是的。 –