BASH:重复数组并按值传递数组

时间:2014-11-10 02:22:00

标签: arrays bash pass-by-value

假设我有一个如下所示的数组foo,请注意第三个元素。

foo=("a" "b" "c c")
echo "${foo[2]}" # "c c"
echo "${#foo[@]}" # "3"

如何将该数组的精确副本创建为变量bar? 然后,如果你想将该数组(按值)传递给函数baz

编辑:已回答答案。

3 个答案:

答案 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