bash変数スコープ

1254 ワード

bashには2つの役割ドメインがあります.1つはグローバル役割ドメイン、すなわちデフォルトで宣言された変数です.もう1つは、localキーワードで宣言されるローカル役割ドメインの変数です.
1)グローバル変数宣言には、次のような状況があります.
#!/bin/bash


mm=12 #visible globally


func() {
    mn=34  #visible globally
    echo "mc=${mc}" #is visible
}


mc=35  #visible globally


# echo "mn={$mn}"  #is not visible
func


echo "mm=${mm};mn=${mn};mc=${mc}"

しかし,関数に宣言されるグローバル変数mnは,主関数が呼び出されないまでは可視ではない.
2)ローカル役割ドメイン,変数宣言時に前にlocalキーワードを追加し,関数にのみ適用できる役割ドメイン
現在の関数ブロックとそのサブ関数内にのみ表示されます.
#!/bin/bash

func1() {
    local loc1=11
    echo "func1 loc1=${loc1}" #is visible
}


func2() {
    echo "func2 loc1=${loc1}"  #is visible
}


func1
echo "local loc1:${loc1}" #not visible

ローカル変数の宣言と単一のコマンドラインに設定すると、操作の順序が変数を先に設定し、
次に変数の作用範囲を制限し、この結果を戻り値に反映します.
次のようになります.
#!/bin/bash


t=$(exit 1)
echo $?  #  return 1
echo "t=${t}"


func() {


    t1=$(exit 1)
    echo $?     #  return 1
    echo "t1=${t1}"


    local t2=$(exit 1)
    echo $? #  return 0
    echo "t2=${t2}"


    local t3
    t3=$(exit 1)
    echo $?  #  return 1
    echo "t3=${t3}"


}


func()