ksh以外のシェルは参照渡しをサポートしていないため、グローバル変数を使用せずに、任意の有効な変数コンテンツを配列要素として含めることができる方法で、複数の配列をbashの関数に渡すにはどうすればよいですか(予約なし) sigils)?
10224 次
2 に答える
33
bash4.3以降
2016年の時点で、最新のbashは参照渡し(別名nameref
属性)を次のようにサポートしています。
demo_multiple_arrays() {
local -n _array_one=$1
local -n _array_two=$2
printf '1: %q\n' "${_array_one[@]}"
printf '2: %q\n' "${_array_two[@]}"
}
array_one=( "one argument" "another argument" )
array_two=( "array two part one" "array two part two" )
demo_multiple_arrays array_one array_two
declare -n
マニュアルページも参照してください。
bash4.3の前
これは、次のように、各配列の前に引数の数を置く呼び出し規約を使用して安全に行うことができます。
demo_multiple_arrays() {
declare -i num_args array_num;
declare -a curr_args;
while (( $# )) ; do
curr_args=( )
num_args=$1; shift
while (( num_args-- > 0 )) ; do
curr_args+=( "$1" ); shift
done
printf "$((++array_num)): %q\n" "${curr_args[@]}"
done
}
これは、次のように呼び出すことができます。
array_one=( "one argument" "another argument" )
array_two=( "array two part one" "array two part two" )
demo_multiple_arrays \
"${#array_one[@]}" "${array_one[@]}" \
"${#array_two[@]}" "${array_two[@]}"
于 2012-06-08T18:02:52.057 に答える
1
eval を使用して実行することもできます。
declare -a a=( "aa bb" 123 '$ $ $' )
declare -a b=( "bb cc" 456 '###' )
printf "\n%s\n" 'a before sub:'
printf "'%s'\n" "${a[@]}"
printf "\n%s\n" 'b after sub:'
printf "'%s'\n" "${b[@]}"
sub ()
{
eval a0=\${$1[0]} # get value a[0]
eval b1=\${$2[1]} # get value b[1]
echo "a[0] = '$a0'"
echo "b[1] = '$b1'"
eval $1[0]='a---a' # set value a[0]
eval $2[1]=999 # set value b[1]
} # ---------- end of function sub ----------
sub a b # call function sub
printf "\n%s\n" 'a after sub:'
printf "'%s'\n" "${a[@]}"
printf "\n%s\n" 'b after sub:'
printf "'%s'\n" "${b[@]}"
出力:
a before sub:
'aa bb'
'123'
'$ $ $'
b after sub:
'bb cc'
'456'
'###'
a[0] = 'aa bb'
b[1] = '456'
a after sub:
'a---a'
'123'
'$ $ $'
b after sub:
'bb cc'
'999'
'###'
于 2012-06-08T19:55:37.650 に答える