2016-03-01 3 views
0

У меня возникают проблемы с итерацией через массив, переданный в качестве аргумента функции в моем сценарии 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

! вызывает замену истории в сценариях bash. –

+1

@ArifBurhan Не в этой конструкции: '$ {! A}'. В нем это косвенная ссылка. Если первый символ параметра является восклицательным знаком (!), Он вводит уровень переменной косвенности.] (Https://www.gnu.org/software/bash/manual/bashref .html # Shell-Parameter-расширения) –

ответ

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