Como iterar um comando com duas variáveis diferentes?

0

Usando o kernel 2.6.x

GNU bash, versão 4.3.42 (1) -release (arm-openwrt-linux-gnu)

Em um script bash, como você escreveria um loop for que produz o seguinte resultado com as variáveis abaixo?

command option option abc option 10
command option option def option 20

VAR1="abc def"

VAR2="10 20"

Eu posso iterar $ VAR1, mas não sei como iterar $ VAR2.

for i in $VAR1; do
command option option "$VAR1" option "$VAR2"
done

A linha de comando deve ser dividida em duas strings, iteradas separadamente e depois concatenadas?

Que tal usar uma variável de contagem com uma matriz? Por exemplo ...

count=1
echo ${VAR1["$count"]}

Poderia uma variável de contagem com um loop while funcionar?

    
por uihdff 16.08.2017 / 19:42

2 respostas

3

Que tal isso:

arr1=(abc def)
arr2=(10 20)

E então:

for (( i=0; i<${#arr1[@]}; i++ )); do echo "${arr1[i]} ${arr2[i]}"; done
abc 10
def 20

No seu caso, a declaração echo terá a seguinte aparência:

for (( i=0; i<${#arr1[@]}; i++ )); do 
    echo "command option option ${arr1[i]} option ${arr2[i]}"
done
command option option abc option 10
command option option def option 20

Veja aqui para exemplos em um estilo C para loop no bash.

    
por 16.08.2017 / 20:19
2

É mais fácil com zsh :

$ a=(a b c) b=(1 2 3)
$ for i j (${a:^b}) echo "i: $i, j: $j"
i: a, j: 1
i: b, j: 2
i: c, j: 3

${a:^b} é o operador de zipagem de matriz (expande para a , 1 , b , 2 , c , 3 acima).

Se você quisesse repetir as palavras resultantes do operador split + glob aplicado a $VAR1 e $VAR2 em um shell parecido com POSIX (como o busybox sh que você parece estar usando de acordo com os comentários para @ resposta do maulinglawns), você poderia usar os parâmetros posicionais.

VAR1='a b c'
VAR2='1 2 3'
set -- $VAR1
for j in $VAR2; do
  echo "i: $1, j: $j"
  shift
done
    
por 16.08.2017 / 21:07