知っているように、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つの引数を受け取ります。最初の引数は配列であるx
に割り当てられ、2番目の引数はy
に割り当てられます。
f
は2つの方法で呼び出すことができます。最初の方法では、"${a[@]}"
を最初の引数として使用します。結果は次のとおりです。
jfaldsj
jflajds
2番目の方法では、"${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"
Bash 4.3+の関数への参照によって配列を渡すことができます。これはおそらくkshから来ていますが、構文は異なります。重要な考え方は、-n属性を設定することです。
show_value () # array index
{
local -n array=$1
local idx=$2
echo "${array[$idx]}"
}
これはインデックス配列に対して機能します:
$ shadock=(ga bu zo meu)
$ show_value shadock 2
zo
また、連想配列でも機能します。
$ days=([monday]=eggs [tuesday]=bread [sunday]=jam)
$ show_value days sunday
jam
Manページのdeclare -n
も参照してください。
最初に「スカラー」値を渡すことができます。それは物事を単純化するでしょう:
f(){
b=$1
shift
a=("$@")
for i in "${a[@]}"
do
echo $i
done
....
}
a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF
f "$b" "${a[@]}"
この時点で、配列のような定位置パラメーターを直接使用することもできます
f(){
b=$1
shift
for i in "$@" # or simply "for i; do"
do
echo $i
done
....
}
f "$b" "${a[@]}"
これにより、関数に配列を渡す問題が解決します。
#!/bin/bash
foo() {
string=$1
array=($@)
echo "array is ${array[@]}"
echo "array is ${array[1]}"
return
}
array=( one two three )
foo ${array[@]}
colors=( red green blue )
foo ${colors[@]}