例 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 つすべてが空の文字列であるため、結果は空の文字列になります。