2

我不太清楚如何理解这一点-

$ var='  '
$ echo "|${var}|"
|  |
$ echo "|${var// /}|"
||

比。

$ set -- '' '' ''
$ echo "|${*}|"
|  |
$ echo "|${*// /}|"
|  |

但是,当我在上面添加这个时

$ IFS=
$echo "|${*// /}|"
||

第二组命令出了什么问题?这是预期的结果吗?

4

1 回答 1

4

示例 1

$ var='  '
$ echo "|${var}|"
|  |
$ echo "|${var// /}|"
||

这里有一个由两个空格组成的简单字符串。当您在两个竖线字符之间展开它时,您会看到竖线之间有两个空格。当您使用模式替换从变量的扩展中删除所有空格时,您会看到两个管道之间的空字符串。

示例 2

$ set -- '' '' ''

首先,您已将前三个位置参数中的每一个都设置为空字符串。您可以通过比较${1-foo}with的结果来观察这一点{$4-foo}(如果设置了参数,则显示参数,如果未设置,则显示 'foo')。

$ echo ${1-foo}

$ echo ${4-foo}
foo

所以我们可以看到它$1是设置的,但为空,而$4它是未设置的。

$ echo "|${*}|"
|  |

接下来,我们看到扩展$*引号内的特殊参数的结果,这是一个由设置的位置参数组成的单个字符串,由参数的第一个字符分隔IFSIFS默认情况下,它的第一个参数是空格,所以我们看到的是一个由 3 个空字符串组成的字符串,每个空字符串用空格分隔,这只是一个由 2 个空格组成的字符串。

$ echo "|${*// /}|"
|  |

当您将模式替换应用于 时$*,替换将分别应用于每个位置参数,然后使用 连接结果参数IFS。由于位置参数已经为空,因此从它们中删除空格会使它们保持不变。所以你得到的结果与你自己扩展时的结果相同$*

示例 3

$ IFS=
$ echo "|${*// /}|"
||

此处的过程与示例 2 中的过程相同,但重要的区别是现在IFS是空字符串,而不是其默认值 ''。再一次,模式替换并没有真正做任何事情,因为没有空格可以从任何位置参数中删除。但是现在,扩展$*会产生一个由位置参数组成的字符串,没有中间字符。而不是$1 $2 $3,你得到$1$2$3。由于这三个本身都是空字符串,因此结果是空字符串。

于 2012-08-22T02:55:31.797 回答