如何使用 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