Bash-数组作为参数

Bash-数组作为参数,bash,Bash,我在函数中使用数组作为参数时遇到问题 #!/usr/bin/env bash function array_param { local ARRAY_s; local ARRAY_t; local OPTIND while getopts 's:t:' opt ; do case "$opt" in s) ARRAY_s=$OPTARG;; t) ARRAY_t=$OPTARG;; esac done shift $((OPT

我在函数中使用数组作为参数时遇到问题

#!/usr/bin/env bash

function array_param
{
  local ARRAY_s; local ARRAY_t; local OPTIND

  while getopts 's:t:' opt ; do
    case "$opt" in
      s) ARRAY_s=$OPTARG;;
      t) ARRAY_t=$OPTARG;;      
    esac
  done
  shift $((OPTIND-1))
  echo "ARRAY_s=${ARRAY_s[@]}; ARRAY_t=${ARRAY_t[@]}"
}

array_s=(100 200 300)
array_t=(0 10 3585)

array_param -s ${array_s} -t ${array_t}
为什么只有第一个元素分配给变量ARRAY_s和ARRAY_t

结果: 数组_s=100;数组_t=0


${array\u s}
相当于
${array\u s[0]}
,这就是为什么只分配第一个元素:

#!/usr/bin/env bash

array_param() {   
    local opt OPTIND tmp
    local -a arr_s arr_t

    while getopts 's:t:' opt; do
        case $opt in
            s) tmp=$OPTARG[@]; arr_s=("${!tmp}") ;;
            t) tmp=$OPTARG[@]; arr_t=("${!tmp}") ;;
        esac
    done
    echo "arr_s = ${arr_s[*]}"
    echo "arr_t = ${arr_t[*]}"
}

arr1=(100 200 300)
arr2=(0 10 3585)

array_param -s arr1 -t arr2
  • localopt
    :您应该本地化所有变量,甚至
    opt
  • tmp=$OPTARG[@]
    :创建此格式的临时变量:
    array\u name[@]
  • arr=(值)
    :数组分配
  • ${!tmp}
    :。它首先扩展到
    $tmp
    的值,然后再次扩展到最终结果:
    ${!tmp}->${array\u name[@]}->所有值

您还可以使用(使代码更可读,但需要
bash
4.3或更高版本):


您不能将
array\u s
array\u t
作为数组传递,
getopts
将只获取每个数组的第一个元素

但是,您可以尝试使用C-style
for
这样的循环来增加本地
ARRAY\s
ARRAY\t
变量,最后打印它们:

    $ cat optarg.sh 
    #!/usr/bin/env bash

    function array_param
    {
      local OPTIND

      while getopts 's:t:' opt ; do
        case "$opt" in
            s) ARRAY_s+=("${OPTARG}");;
            t) ARRAY_t+=("${OPTARG}");;      
        esac
      done
      shift $((OPTIND-1))
    }

    array_s=(100 200 300)
    array_t=(0 10 3585)

    #Works if only array_s length equal array_t length.
    for ((args=0; args<${#array_s[@]}; args++))
    do
        array_param -s ${array_s[args]} -t ${array_t[args]}
    done

    echo "ARRAY_s=${ARRAY_s[@]}; ARRAY_t=${ARRAY_t[@]}"

稍微修改函数(变量使用小写,数组语义)

可以称为

array_param "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
  • ${array_s[@]/#/-s}
    表示法对于bash是特定的,
    #
    匹配字符串的开头,并为数组中的每个元素替换为
    -s
遵循printf以了解参数是如何传递的

printf "<%s> " "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf”““${array_s[@]/#/-s}”“${array_t[@]/#/-t}”
也比较

printf "<%s> " "${array_s}"
printf "<%s> " "${array_s[@]}"
printf "<%s> " "${array_s[*]}"
printf”““${array\u s}”
printf“${array_s[@]}”
printf“”“${array_s[*]}”

${array\u s}
是数组的第一个元素。请尝试
“${array_s[@]}”
array_s=$OPTARG
也只是字符串赋值,而不是数组赋值。你到底想做什么?将参数后面的数组复制到
ARRAY\u s
ARRAY\u t
?是的,我尝试将-s和-t参数分配给一个变量并在函数中使用它(我只插入了一个无法求解的片段)。您缺少引号
“$OPTARG”
。否则,
/#/-s
..+1的有趣用法。@PesaThe,true,已修复
array_param "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf "<%s> " "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf "<%s> " "${array_s}"
printf "<%s> " "${array_s[@]}"
printf "<%s> " "${array_s[*]}"