迭代通过在shell脚本

时间:2016-03-01 22:53:35

标签: arrays bash shell for-loop

我在迭代通过作为参数传递给我的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

它似乎没有在循环中执行语句。

1 个答案:

答案 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[@]}"的所有值。