加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 将多个不同的数组传递给shell函数

发布时间:2020-12-15 22:47:12 所属栏目:安全 来源:网络整理
导读:因为除了ksh之外的 shell不支持pass-by-reference,如何在不使用全局变量的情况下将多个数组传递给bash中的函数,并且允许将任何合法变量内容作为数组元素包含在内(不保留印记)? 解决方法 自从bash 4.3 截至2016年,现代bash支持pass-by-reference(a.k.a namer
因为除了ksh之外的 shell不支持pass-by-reference,如何在不使用全局变量的情况下将多个数组传递给bash中的函数,并且允许将任何合法变量内容作为数组元素包含在内(不保留印记)?

解决方法

自从bash 4.3

截至2016年,现代bash支持pass-by-reference(a.k.a nameref属性):

demo_multiple_arrays() {
  local -n _array_one=$1
  local -n _array_two=$2
  printf '1: %qn' "${_array_one[@]}"
  printf '2: %qn' "${_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.

在bash 4.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)): %qn" "${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[@]}"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读