2016-03-01 96 views
0

我在迭代通過作爲參數傳遞給我的bash腳本中的函數的數組時遇到問題。我認爲this question的答案可以解決我的問題,但是我得到了一個不同的錯誤,問題很老,所以我想我應該問一個新問題。在shell腳本中遍歷數組作爲參數給出的參數

我想這個代碼轉換爲一個功能,這樣我就可以傳遞不同的參數:

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

!在bash腳本中導致歷史替換。 –

+1

@ArifBurhan不在這個構造中:'$ {!a}'。其中,它是一個間接引用[如果參數的第一個字符是感嘆號(!),則引入一個變量間接級別。](https://www.gnu.org/software/bash/manual/bashref html的#殼參數擴展) – 2016-03-02 04:13:28

回答

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[@]}"