1. ホーム
  2. arrays

[解決済み] Bashで関数の引数として配列を渡す方法

2023-03-21 17:27:36

質問

ご存知のように、bashプログラミングでは、引数を渡す方法として $1 , ..., $N . しかし,複数の引数を受け取る関数に引数として配列を渡すのは簡単ではありません.以下はその一例である。

f(){
 x=($1)
 y=$2

 for i in "${x[@]}"
 do
  echo $i
 done
 ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "${a[@]}" $b
f "${a[*]}" $b

説明したように、関数 f は2つの引数を受け取ります。1つ目の引数は x に割り当てられ、2番目は配列である y .

f は2つの方法で呼び出すことができます。最初の方法は "${a[@]}" を第一引数にとり、その結果は次のようになります。

jfaldsj 
jflajds

もう一つの方法は "${a[*]}" を第一引数とした場合、その結果は

jfaldsj 
jflajds 
LAST

どちらの結果も私が望んだ通りではありません。そこで、関数間で正しく配列を渡す方法について、何かアイデアをお持ちの方はいらっしゃいませんか?

どのように解決するのですか?

配列を渡すことはできず、その要素(つまり展開された配列)のみを渡すことができます。

#!/bin/bash
function f() {
    a=("$@")
    ((last_idx=${#a[@]} - 1))
    b=${a[last_idx]}
    unset a[last_idx]

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f "${x[@]}" "$b"
echo ===============
f "${x[*]}" "$b"

もう一つの可能性は、配列を名前で渡すことでしょう。

#!/bin/bash
function f() {
    name=$1[@]
    b=$2
    a=("${!name}")

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f x "$b"