2

これを理解する方法がよくわかりません-

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

対。

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

ただし、上記の後にこれを追加すると

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

2 番目のコマンド セットで何が間違っているのでしょうか? これは期待される結果ですか?

4

1 に答える 1

4

例 1

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

ここには、2 つのスペースからなる単純な文字列があります。2 つのパイプ文字の間に展開すると、パイプの間に 2 つのスペースが表示されます。パターン置換を使用して変数の展開からすべてのスペースを削除すると、2 つのパイプの間に空の文字列が表示されます。

例 2

$ set -- '' '' ''

最初に、最初の 3 つの定位置パラメーターをそれぞれ空の文字列に設定しました。${1-foo}これは、 withの結果を比較することで確認でき{$4-foo}ます (設定されている場合はパラメーターが表示されますが、設定されていない場合は 'foo' が表示されます)。

$ echo ${1-foo}

$ echo ${4-foo}
foo

したがって、設定されていることがわかり$1ますが、null であり、設定されていません$4

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

次に、引用符内の特殊パラメーターを展開した結果が表示されます。$*これは、パラメーターの最初の文字で区切られた、設定された位置パラメーターで構成される単一の文字列IFSです。IFSデフォルトでは、最初のパラメーターとしてスペースが含まれているため、それぞれがスペースで区切られた 3 つの空の文字列で構成される文字列が表示されます。これは、2 つのスペースからなる単一の文字列です。

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

にパターン置換を適用する$*と、結果のパラメータが を使用して結合される前に、各位置パラメータに置換が個別に適用されますIFS。位置パラメータはすでに空であるため、スペースを削除しても変更されません。したがって、単独で展開したときと同じ結果が得$*られます。

例 3

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

ここでの手順は例 2 と同じですが、重要な違いIFSは、デフォルトの '' ではなくヌル文字列になっていることです。繰り返しますが、パターン置換は実際には何もしません。位置パラメーターから削除するスペースがないからです。しかし現在、展開$*すると、文字が介在しない位置パラメータで構成される文字列が生成されます。の代わりに$1 $2 $3、 が得られ$1$2$3ます。3 つすべてが空の文字列であるため、結果は空の文字列になります。

于 2012-08-22T02:55:31.797 に答える