para loop sobre uma lista

1

Eu tenho um pequeno script que deve imprimir algumas chamadas para um makefile que eu tenho.

mylist='$(call list_samples,AON_9,NT_1,SC_17) $(call list_samples,AON_10,NT_2,SC_18) $(call list_samples,AON_11,NT_3,SC_19) $(call list_samples,AON_12,NT_4,SC_20) $(call list_samples,AON_13,NT_5,SC_21) $(call list_samples,AON_14,NT_6,SC_22) $(call list_samples,AON_15,NT_7,SC_23) $(call list_samples,AON_16,NT_8,SC_24)'

for SAMPLES_OUT in $mylist;
do
echo "$SAMPLES_OUT"
done

Saída:

$(call
list_samples,AON_9,NT_1,SC_17)
$(call
list_samples,AON_10,NT_2,SC_18)
$(call
list_samples,AON_11,NT_3,SC_19)
$(call
list_samples,AON_12,NT_4,SC_20)
$(call
list_samples,AON_13,NT_5,SC_21)
$(call
list_samples,AON_14,NT_6,SC_22)
$(call
list_samples,AON_15,NT_7,SC_23)
$(call
list_samples,AON_16,NT_8,SC_24)

o problema que estou enfrentando é que o loop for está dividindo em espaços e, portanto, as chamadas $ e list_samples são desmontadas enquanto devem ser, na verdade, uma chamada. assim:

$(call list_samples,AON_9,NT_1,SC_17)
$(call list_samples,AON_10,NT_2,SC_18)
$(call list_samples,AON_11,NT_3,SC_19)
$(call list_samples,AON_12,NT_4,SC_20)
$(call list_samples,AON_13,NT_5,SC_21)
$(call list_samples,AON_14,NT_6,SC_22)
$(call list_samples,AON_15,NT_7,SC_23)
$(call list_samples,AON_16,NT_8,SC_24)

Eu tentei colocar as strings em "" mas isso não funciona, já que é uma lista criada com "" ele vê tudo entre elas como uma string. Quaisquer sugestões são apreciadas. Obrigado!

    
por Sander Van der Zeeuw 13.02.2015 / 12:58

3 respostas

2

Você precisa usar uma matriz para manter os elementos juntos:

mylist=(
    '$(call list_samples,AON_9,NT_1,SC_17)'
    '$(call list_samples,AON_10,NT_2,SC_18)'
    '$(call list_samples,AON_11,NT_3,SC_19)'
    '$(call list_samples,AON_12,NT_4,SC_20)'
    '$(call list_samples,AON_13,NT_5,SC_21)'
    '$(call list_samples,AON_14,NT_6,SC_22)'
    '$(call list_samples,AON_15,NT_7,SC_23)'
    '$(call list_samples,AON_16,NT_8,SC_24)'
)
for SAMPLES_OUT in "${mylist[@]}"    # crucial to use quotes here
do
    echo "$SAMPLES_OUT"
done
    
por 13.02.2015 / 13:18
3

Você também pode usar um separador diferente do padrão (o padrão sendo espaço, tabulação e nova linha):

mylist='
$(call list_samples,AON_9,NT_1,SC_17) 
$(call list_samples,AON_10,NT_2,SC_18) 
$(call list_samples,AON_11,NT_3,SC_19) 
$(call list_samples,AON_12,NT_4,SC_20) 
$(call list_samples,AON_13,NT_5,SC_21) 
$(call list_samples,AON_14,NT_6,SC_22) 
$(call list_samples,AON_15,NT_7,SC_23) 
$(call list_samples,AON_16,NT_8,SC_24)
'

IFS='
'       # split on newline only
set -f  # disable globbing
for samples_out in $mylist # invoke the split+glob operator
do
  printf '%s\n' "$samples_out"
done

Dessa forma, você pode continuar usando a sintaxe sh padrão.

    
por 13.02.2015 / 13:57
0

Pelo que eu posso dizer, o problema pode ser que você esteja incluindo muitos dados estáticos na sua definição de variável. Parece-me que seus dados reais de variáveis são apenas um simples conjunto de três números, cada um deles incrementado em um por iteração. O resto está apenas se vestindo. Então talvez ...

 pr_samples()( 
     for n in lmt AON NT SC
     do  : "$(($n=(${1##*[!-0-9]*}0/10)-1))"
            shift "$((!!$#))"
     done;  lmt=$((lmt+AON+1))
     until [ "$AON" -gt "$lmt" ]
     do    printf '$(call list_samples,AON_%d,NT_%d,SC_%d)\n' \
                  "$((AON+=1))" "$((NT+=1))" "$((SC+=1))"
     done
)

... o que criaria seu conjunto se chamado como:

 pr_samples 7 9 1 17

... onde o primeiro argumento é a contagem de iteração e os próximos três são os valores iniciais para $AON , $NT e $SC , respectivamente. Um argumento de valor nulo é interpretado como um zero.

De qualquer forma, chamado como acima, imprime:

$(call list_samples,AON_9,NT_1,SC_17)
$(call list_samples,AON_10,NT_2,SC_18)
$(call list_samples,AON_11,NT_3,SC_19)
$(call list_samples,AON_12,NT_4,SC_20)
$(call list_samples,AON_13,NT_5,SC_21)
$(call list_samples,AON_14,NT_6,SC_22)
$(call list_samples,AON_15,NT_7,SC_23)
$(call list_samples,AON_16,NT_8,SC_24)

Pode ser útil passar a string de formato printf como um argumento também.

    
por 22.02.2015 / 04:19

Tags