shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] loop que le varios arquivos


From: Fábio Olivé Leite
Subject: Re: [shell-script] loop que le varios arquivos
Date: Thu, 1 May 2003 19:37:47 -0300
User-agent: KMail/1.4.3

Olá!

Em Qui 01 Mai 2003 18:26, Germano Barreiro escreveu:
>
> Como eu implemento um loop que le mais de um arquivo
> ao mesmo tempo, ou seja, uma linha de cada arquivo a
> cada interacao do loop?

É só fazer um uso mais avançado dos redirecionamentos (o bash suporta 
várias manipulações de descritores de arquivos). Por exemplo:

$ cat arq1
Linha 1 Arq 1
Linha 2 Arq 1
Linha 3 Arq 1

$ cat arq2
Linha 1 Arq 2
Linha 2 Arq 2
Linha 3 Arq 2
Linha 4 Arq 2
Linha 5 Arq 2

$ cat linhas.sh
#!/bin/bash
exec 10<arq1
exec 11<arq2
a1=eca
a2=eca
while [ -n "$a1" -o -n "$a2" ]; do
        read a1 <&10
        read a2 <&11
        [ -n "$a1" ] && echo $a1
        [ -n "$a2" ] && echo $a2
done

$ bash linhas.sh
Linha 1 Arq 1
Linha 1 Arq 2
Linha 2 Arq 1
Linha 2 Arq 2
Linha 3 Arq 1
Linha 3 Arq 2
Linha 4 Arq 2
Linha 5 Arq 2

O que o script faz é usar o exec para que o file descriptor (fd) 10 do 
shell que está executando o script seja aberto para leitura do 
arquivo arq1, e o fd 11 seja aberto para leitura do arquivo arq2. Aí 
fazes um loop como quiser (eu neste exemplo fiz o loop continuar 
enquanto houver algum valor em alguma das variáveis, por isso que as 
inicializei com "eca") e quando quiseres ler uma linha do arquivo 
arq1, basta fazer um read VAR <&10, e <&11 para o arq2.

O <&n significa "redirecione a entrada do comando a partir do file 
descriptor n". Qualquer processo em Unix já sai com três fds 
ocupados, 0, 1 e 2. 0 é a entrada padrão, 1 a saída padrão e 2 a 
saída de erro padrão.

Por isso que frequentemente se usa 2>/dev/null quando não se quer ver 
as mensagens de erro de um programa.

Espero que tenha ficado compreensível! :)

-- 
OpenBSD: Unix casca grossa -=- KNOW THYSHELL (that is, man ksh)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]