array
特に、関数が中間にある場合、どのように関数に渡しますか?どちら"${b}"
も"${b[@]}"
最初の項目だけを渡すようですが、同時に呼び出して検索する方法はありますか?
#/usr/bin/env bash
touch a b1 b2 b3 c
f()
{
local a="${1}"
local b="${2}"
local c="${3}"
ls "${b[@]}" # expected b1 b2 b3
}
a=a
b=("b1" "b2" "b3")
c=c
f "${a}" "${b}" "${c}"
f "${a}" "${b[@]}" "${c}"
rm a b1 b2 b3 c
答え1
シェルから配列内のすべての個々の要素(配列インデックスによるソート)への拡張は、配列デザインがコピーされるbash
シェルksh
と同じです。bash
"${array[@]}"
"$array"
"${array[0]}"
したがって、配列のすべての要素を関数に渡すことはですf "${array[@]}"
。
これで関数のパラメータは を介してアクセスされるので、"$@"
関数は次のようになります。
f() {
ls -ld -- "$@"
}
f "$a" "${b[@]}" "$c"
別のオプションは、名前で配列を渡し、名前付き参照を使用することです((ksh93)bash
からksh
コピーした他の機能):
f() {
typeset -n array="$1"
ls -ld -- "${array[@]}"
}
f b
または、f
ファイル名、配列名、他のファイル名など3つのパラメータを使用します。
f() {
typeset -n array="$2"
ls -ld -- "$1" "${array[@]}" "$3"
}
f "$a" b "$c"
csh
配列(、、、、、、、tcsh
)を持つ他のほとんどすべてのシェルでは、単に使用して配列内のすべてのrc
要素に拡張できます。他のすべてのシェルでは、配列は通常(非希少)配列でもあります。ただし、いくつかの注意事項があります。 csh/tcsh と yash ではまだ分割+globの影響を受け、これを解決するにはinとout が必要で、では null 削除 (再度または周辺) の影響を受けます。es
zsh
yash
fish
$array
$array
$array:q
(t)csh
"${array[@]}"
yash
zsh
$array
"${array[@]}"
"$array[@]"
"${(@)array}"