Redirecionar entrada de um arquivo para um programa

0

Eu tentei escrever um programa que pode ler entrada de um arquivo e fiquei preso. meu programa é prog:

#!/bin/bash
num=$(($1 + $2))
echo $num

minha entrada test.in:

1
1

eu usei

./prog < test1.in

mas recebi mensagem de erro
./prog: linha 2: +: erro de sintaxe: operando esperado (token de erro é "+")

O que há de errado? Obrigado!

    
por Nicole Yan 14.01.2017 / 21:24

2 respostas

3

O que você escreveu não é um programa que lê entrada de um arquivo, mas um programa que recebe sua entrada na forma de parâmetros posicionais (também conhecidos como argumentos de linha de comando). O operador de redirecionamento < envia seus dados de arquivo para o fluxo de entrada padrão do programa (também conhecido como stdin ) - que seu programa ignora.

Na sua forma mais simples, para ler uma linha por valor da entrada padrão, você pode alterar seu programa para

#!/bin/bash
read a
read b
num=$((a+b))
echo $num

Agora, quando você redirecionar stdin do seu arquivo de teste, o resultado deve ser

$ ./newprog < test1.in
2

Como alternativa, você poderia ter usado o utilitário xargs para ler os dados do arquivo e passar seu conteúdo para o programa como argumentos

$ xargs -a test1.in ./prog
2
    
por 14.01.2017 / 21:49
0

O programa que você escreveu:

#!/bin/bash
num=$(($1 + $2))
echo "$num"

Espera que os valores de $1 e $2 (que são argumentos posicionais) sejam fornecidos na lista de argumentos para o programa (script).
Para que esse programa funcione, você precisa chamá-lo assim:

$ ./prog 3 5 
8

Colocando cada argumento $1 e $2 na linha de comando de chamada.

Se você precisar de um programa que leia a entrada de um arquivo, será necessário usar a leitura:

#!/bin/bash
read var1
read var2
num=$((var1 + var2))
echo "$num"

Então, você chama assim:

$ ./newprog < test1.in
2
    
por 14.01.2017 / 22:11

Tags