como podemos usar múltiplas variáveis em single para loop no shell script?

3

Estou implementando o código abaixo usando loop, mas a saída errada vem depois de executar o script.

for i in 'awk -F"|" '{print $1}' $INPUTFILE', j in 'awk -F"|" '{print $2}' $INPUTFILE'
do
echo $i:$j
done  

Por favor me ajude a usar múltiplas variáveis em single para loop no shell script.

    
por user3548033 28.04.2016 / 16:39

3 respostas

6

Talvez você realmente queira:

while IFS='|' read -r i j rest <&3; do
  {
    printf '%s\n' "something with $i and $j"
  } 3<&-
done 3< "$INPUTFILE"

Mas o uso de um loop de shell para processar o texto geralmente é o caminho errado a seguir .

Aqui, parece que você precisa:

awk -F '|' '{print $1 ":" $2}' < "$INPUTFILE"

Agora como uma resposta à pergunta no título, para um shell com for loops usando mais de uma variável, você tem zsh (parece que você já está usando a sintaxe zsh não citando suas variáveis ou não desabilitar o globbing ao dividir a substituição de comando):

$ for i j in {1..6}; do echo $i:$j; done
1:2
3:4
5:6

Ou a forma mais curta:

for i j ({1..6}) echo $i:$j

O equivalente com shells POSIX:

set -- 1 2 3 4 5 6
## or:
# IFS='
# ' # split on newline
# set -f # disable globbing
# set -- $(awk ...) # split the output of awk or other command
while [ "$#" -gt 0 ]; do
  echo "$1:$2"
  shift 2
done
    
por 28.04.2016 / 16:58
5

o bash permite loops com mais de uma variável, mas apenas na sintaxe C:

for ((i=0,j=10;i<=j;i++,j--))
do
   echo "i=$i"
   echo "j=$j"
done
    
por 28.04.2016 / 17:16
0

Você precisará de vários loops se quiser iterar mais de uma variável, como for i in 1 2 3; do for j in a b c; do ...; done; done . quando a lista de coisas para iterar é a saída de um outro comando, você precisará incluir esse outro comando em $() .

    
por 28.04.2016 / 16:49