3

CentOS の /etc/init.d/functions に次のコードが見つかりました。

status() {
    local base pid lock_file= pid_file=
    ...

4 つの変数が宣言されています。そのうちの 2 つ、base と pid は初期化されていません。しかし、それらの残りは空の値、lock_file および pid_file で初期化されます。

次のコードをテストしましたが、違いは見つかりませんでした。

local a b=

echo "a is $a, length is ${#a}"
echo "b is $b, length is ${#b}"

それらの間に違いはありますか?

4

1 に答える 1

3

はい、違いあります。次の関数を検討してください。

x() {
    local a b=

    echo ${a-X}
    echo ${b-X}
}

この関数を呼び出すbash-4.xと、次の出力が得られます。

$ x
X

$

${parameter−word} パラメータ展開wordは、パラメータが設定されていない場合は(この場合は )の展開に展開され、X設定されている場合はパラメータ値に展開されます。

出力例から、local a変数aを未設定のままにし、local b=明示的に空 (null) 文字列に設定していることは明らかです。

編集:

一方、bash-3.xこれを取得すると:

$ x


$

関数内でを呼び出すと、 inがその変数を空の文字列に初期化setすることが検証されます。ただし、これはバグだったようです。変更ログから:local abash-3.xbash

このドキュメントでは、このバージョンの bash-4.0-beta と以前のバージョンの bash-4.0-alpha の間の変更点について詳しく説明します。

...

e. 値がないのではなく、空の文字列を値として使用してローカル変数が作成されるバグを修正しました。

于 2012-08-12T23:35:28.877 に答える