如何传递数组作为参数?

如何传递数组作为参数?

如何将 an 传递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

bashshell 中,就像在复制了ksh数组设计的 shell中一样bash"${array[@]}"扩展为数组的所有不同元素(按数组索引排序),并且"$array"与 相同"${array[0]}"

因此,要将数组的所有元素传递给函数,就是f "${array[@]}".

现在,函数的参数是通过 访问的"$@",因此您的函数应该类似于:

f() {
  ls -ld -- "$@"
}

f "$a" "${b[@]}" "$c"

另一种选择是按名称传递数组并使用命名引用(bashksh(ksh93) 复制的另一个功能):

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" 

在几乎所有其他具有数组(cshtcshrceszshyashfish)的 shell 中,您只需使用$array来扩展到数组的所有元素。在所有其他 shell 中,数组也是普通(非稀疏)数组。但有一些警告:在 csh/tcsh 和 yash 中,$array仍然会受到 split+glob 的影响,并且您需要$array:qin(t)csh"${array[@]}"inyash来解决它,而在, 中zsh$array会受到空删除的影响(再次"${array[@]}"or"$array[@]""${(@)array}"有效)周围)。

相关内容