Bashの動作:下線と一致変数名を使用して配列を強制しますか?

Bashの動作:下線と一致変数名を使用して配列を強制しますか?

以下のコードスニペットでは、Bashの関数に複数の配列を渡そうとしたときに、最初の例の構文を使用して渡すことができることがわかりました。ただし、次の場合にのみ可能です。

  1. 配列変数名の前にはアンダースコア(_)が付きます。
  2. 受信関数の配列変数名は呼び出し関数名と同じです。
function list_arrays {
    local _array_one=$1
    local _array_two=$2
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

出力:

1
2
3
4
5
one
two
three
four
five

下線を削除するために、例を少し変更します。

#!/bin/bash

function list_arrays {
    local array_one=$1
    local array_two=$2
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

出力:

1
2

list_arrays関数で配列変数の名前を変更する最後の反復

#!/bin/bash

function list_arrays {
    local _array_first=$1
    local _array_second=$2
    for ip in "${_array_first[@]}"; do
        echo "$ip"
    done
    for node in "${_array_second[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

出力:


(出力なし)

この動作は非常に便利ですが、本番スクリプトで使用する前に何をしているのか理解したいと思います。最初はこれが関連していると思いました。参照として渡す。しかし、この構文は、参照による転送が追加される前であるように見えるBash 4.1で動作します。

ベストアンサー1

このコードは期待どおりに機能します。

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

渡されたパラメータは2つの配列ではありません1 2 3 4 5 one two three four five

この関数は、list_arrays渡されたパラメータではなく、定義されたlocal array_one合計を印刷します。local array_two 主な機能から

コードを次に変更すると、これを確認できます。

function list_arrays {
    # no variable definition
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    # no arguments passed
    list_arrays
}

出力:

1
2
3
4
5
one
two
three
four
five

変数local _array_one=$1であり、local _array_two=$2実際にはコードではまったく使用されません。


次の変数をオーバーライドすると

function list_arrays {
    local array_one=$1 # overwrites main's array_one
    local array_two=$2 # overwrites main's array_two
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )

    # arguments passed are 1 2 3 4 5 one two three four five
    list_arrays "${array_one[@]}" "${array_two[@]}"

}

これで、array_one最初のパラメータ1array_two2番目のパラメータと同じなので、2出力は次のようになります。

1
2

おすすめ記事