bash - 変数int値を使用して関数の位置パラメータを参照する

bash - 変数int値を使用して関数の位置パラメータを参照する

変数を使いたいです。

i=1

スクリプトへの参照として渡された位置変数の値。例:

x=101
y=201
z=301

foo(){
    echo "$1"
    echo "$2"
    echo "$3"
}

foo x y z

出力:

101
201
301

iインデックスごとに各パラメータを参照するのではなく、インデックス変数を使用してインクリメントするにはどうすればよいですか?

言う:

foo() {
    local i=1
    echo "$i" #echo first paramter
    (( i+=1 ))
    echo "$i" #echo second parameter
    #etc.
}

この部分の構文は何ですかecho "$i"

@Ericの回答後に更新されました

~$ t=5
~$ foo() { i=1; echo "${!i}"; }
~$ foo t
t
~$

アップデート#2

簡単に言えば、私の方法を操作できる唯一の方法は次のとおりです。

foo() { #assuming 3 parameters

    i=0
    (( i+=1 ))
    var="${!i}"
    echo "${!var}"

    (( i+=1 ))
    var="${!i}"
    echo "${!var}"

    (( i+=1 ))
    var="${!i}"
    echo "${!var}"        
}

ベストアンサー1

これはSO質問に似ていますここ、これは@costasコメントに似ています。以下を使用して$#パラメータ数を取得できます。間接参照${!i}名前で変数にアクセスするのと同じです。例は次のとおりです。

f() {
    for((i=1; i<=$#; i++)); do
        printf "%d %s\n" "$i" "${!i}"
    done
}

f a b c

印刷:

1 a
2 b
3 c

変数名を位置引数として渡す場合は、次のように間接参照レイヤーを追加できます。

a=first
b=second
c=third

f() {
    for((i=1; i<=$#; i++)); do
        var="${!i}"
        printf "%d %s\n" "$i" "${!var}"
    done
}

f a b c

印刷

1 first
2 second
3 third

これにより、各パラメータを変数名として処理してそこに保存できますvar。それから私たちはprintf

一度に1レベルの間接参照のみを取得でき、入れ子には効果がありません。したがって、一度にやろうとすると、${!${!i}}最初から{拡張が開始され、残りは拡張される PARAMETER 値として扱われるので役に立ちません。最初の文字は、!残りの文字を必要なパラメータ名を含むPARAMETER名として扱いますが、${!i}有効なパラメータ名ではないため、bad substitution2つの手順でこの問題を回避できます。

おすすめ記事