Bash Shell参数扩展$ {}

时间:2012-08-22 00:38:40

标签: bash shell scripting

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

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

Vs以上。

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

但是,当我在上面添加之后

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

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

1 个答案:

答案 0 :(得分:4)

示例1

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

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

示例2

$ set -- '' '' ''

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

$ echo ${1-foo}

$ echo ${4-foo}
foo

因此,我们可以看到$1已设置,但为空,而$4未设置。

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

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

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

将模式替换应用于$*时,在使用IFS连接结果参数之前,将替换应用于每个位置参数。由于位置参数已经为空,因此从中删除空格会使它们保持不变。因此,您可以获得与仅展开$*时相同的结果。

示例3

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

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