我在迭代通过作为参数传递给我的bash脚本中的函数的数组时遇到了问题。我认为this question的答案可以解决我的问题,但是我得到了一个不同的错误,问题已经很老了,所以我想我应该问一个新问题。
我正在尝试将此代码转换为函数,因此我可以传递不同的参数:
EX='WT'
declare -a SCN=('fq1'
'fq2'
'fq3' )
for i in "${SCN[@]}"; do
echo $i
echo $EX'_'$i
done
打印
fq1
WT_fq1
fq2
WT_fq2
fq3
WT_fq3
我尝试过:
function myfx(){
echo $1
MYNOR=("${!2}")
for i in ${MYNOR[@]}; do
echo $i
echo $1'_'$i
done
}
myfx $EX $SCN[@]
不幸的是,我从中得到的只是
WT
它似乎没有在循环中执行语句。
答案 0 :(得分:0)
使功能正常工作的一种方法是:
function myfx(){
echo "\$1=$1 \$2=$2"
b=$2'[@]'
for i in "${!b}"; do
echo "$i"
echo "$1_$i"
done
}
myfx "$EX" "SCN"
请注意,调用该函数的值为$EX
,标签为SCN
。
在标签用于构建间接令牌b=$2'[@]'
的函数内部。
然后,间接令牌用于生成SCN
内的值列表
使用bash ${!b}
的间接方法。
更复杂的选项是仅使用标签来调用函数:
function myfx(){
echo "\$1=$1 \$2=$2"
a=${!1}
b=$2'[@]'
for i in "${!b}"; do
echo "$i"
echo "${a}_$i"
done
}
myfx "EX" "SCN"
唯一增加的复杂性是$EX
上的间接需求。
但可能最简单的解决方案是传递所需的所有参数:
function myfx(){
echo "\$1=$1 \$2=$2"
a=$1; shift
for i do
echo "$i"
echo "${a}_$i"
done
}
myfx "$EX" "${SCN[@]}"
简单for i
将迭代所有参数,在上面一行上移后,将是"${SCN[@]}"
的所有值。