假设我有一个如下所示的数组foo
,请注意第三个元素。
foo=("a" "b" "c c")
echo "${foo[2]}" # "c c"
echo "${#foo[@]}" # "3"
如何将该数组的精确副本创建为变量bar
?
然后,如果你想将该数组(按值)传递给函数baz
?
编辑:已回答答案。
答案 0 :(得分:1)
如果你想通过 reference 传递一个数组(这是你的代码实际上做的),bash 4.3允许用namevars完成:
foo=( hello "cruel world" )
print_contents() {
local -n array=$1
printf '%q\n' "${array[@]}"
}
print_contents foo
如果您希望通过值传递,甚至更容易(即使使用古代版本也能正常运行):
foo=( hello "cruel world" )
print_contents() {
printf '%q\n' "$@"
}
print_contents "${foo[@]}"
如果你想按值传递多个数组,相反:
foo=( hello "cruel world" )
bar=( more "stuff here" )
print_arrays() {
while (( $# )); do
printf '%s\n' "Started a new array:"
local -a contents=()
local array_len
array_len=$1; shift
for ((n=0; n<array_len; n++)); do
contents+=( "$1" ); shift
done
printf ' %q\n' "${contents[@]}"
done
}
print_arrays "${#foo[@]}" "${foo[@]}" \
"${#bar[@]}" "${bar[@]}"
答案 1 :(得分:0)
当我写这个问题时,我最终找到了答案。这是思路。
以下几次尝试
bar=foo # String "foo"
bar=$foo # First element of array foo "a"
bar=${foo[@]}
echo "${#bar[@]}" # "1"
echo "${bar[0]}" # "a b c c"
bar=(${foo[@]})
echo "${#bar[@]}" # "4"
echo "${bar[2]}" # "c"
echo "${bar[3]}" # "c"
bar=("${foo[@]}")
echo "${#bar[@]}" # "3"
echo "${bar[2]}" # "c c"
baz () {
eval "bar=(\"\${$1[@]}\")"
for item in "${bar[@]}"
do
echo "$item"
done
# a
# b
# c c
}
答案 2 :(得分:0)
function baz {
set $1[@]
printf '%s\n' "${!1}"
}
foo=(a b 'c c')
bar=("${foo[@]}")
baz bar