将数组传递给 bash 函数

将数组传递给 bash 函数

如何使用 nameref 将数组作为输入传递给 bash 函数?尚未找到执行此操作的非常具体的信息。

例如,我有一个数组incl,我想将其传递给函数,然后函数返回isufx.

## Split INCL by field separator FS
for ext in "${incl[@]}"; do

  if [[ "$ext" == "PROGL" ]]; then
    isufx+=( --include=\*.{rc,el,c,f} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  elif [[ "$ext" == "PEXTD" ]]; then
    isufx+=( --include=\*.{rc,el,c,f} )
    isufx+=( --include=\*.{cp,cpp,f90,f95,f03,f08} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  elif [[ "$ext" == "TYPOG" ]]; then
    isufx+=( --include=\*.{org,texi,tex} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  fi

答案1

fill_array()
  typeset -n _in="$1" _out="$2"
  typeset _ext
  for _ext in "${_in[@]}"; do
    case $_ext in
      (PEXTD) _out+=( '--include=*.'{cp,cpp,f90,f95,f03,f08} ) ;& # fall through
      (PROGL) _out+=( '--include=*.'{rc,el,c,f} ) ;;
      (TYPOG) _out+=( '--include=*.'{org,texi,tex} ) ;;
      (*) continue
    esac
    (( vb < 2 )) || printf>&2 ' ext: %s\n' "$_ext"
  done
}

fill_array incl isufx

这里还使用了一种case似乎比一种说法更合适的说法if

我们通过名字该函数的两个变量。函数内部_in被定义为名称引用其名称在第一个参数中传递的变量,以及_out第二个参数。

然后,当函数中引用$_in或时,它们会自动转换为引用的函数。$_out

我们_在函数中为变量名添加前缀,以限制函数被函数中碰巧使用的变量调用的风险,就像在 bash 中一样,这与 ksh93 相反,其中 nameref 功能来自 1 或 zsh2,这不会起作用实施要粗糙得多。


¹ ksh 也是typeset来自哪里。事实上,bash几十年后复制了该功能但决定调用该命令,declare我觉得这很烦人。值得庆幸的是,它也接受typeset作为别名。

² 截至撰写时的 nameref 仅在当前开发版本中可用。

答案2

你错过了done循环末尾的

#!/bin/bash

function my_function() {
  declare -n myarray="$1"
  local isufx=()
  
  for ext in "${myarray[@]}"; do
    if [[ "$ext" == "PROGL" ]]; then
      isufx+=( --include=\*.{rc,el,c,f} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    elif [[ "$ext" == "PEXTD" ]]; then
      isufx+=( --include=\*.{rc,el,c,f} )
      isufx+=( --include=\*.{cp,cpp,f90,f95,f03,f08} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    elif [[ "$ext" == "TYPOG" ]]; then
      isufx+=( --include=\*.{org,texi,tex} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    fi
  done
  
  echo -e "${isufx[@]}"
}

my_include=("PROGL" "EMPTY" "PEXTD" "TYPOG" "NONAME")
my_function my_include

exit

相关内容