erro de script bash

1

Eu tinha o seguinte script que estava funcionando bem.

#!/bin/bash

OUTFILE=somefile.txt
(
./runnable input << EOF
2
4
EOF
) > $OUTFILE

mas depois tive a necessidade de mudar argumentos. Existem 100 arquivos em um diretório, cada arquivo tem dois números. esses dois números precisam ser alimentados ao script acima. 100 arquivos têm dados neles assim:

2,4
9,2
4,2

Então eu mudei o script para o seguinte, mas isso não parece funcionar.

#!/bin/bash

OUTFILE=file3.txt
(
while read line
do
./runnable input << EOF

#following gets first number before comma
test=$(echo 'expr index "$line" ,' )
echo ${line:0:($test-1)}
line=$(echo ${line:$test})

#following gets second number after comma
test=$(echo 'expr index "$line" ,' )
echo ${line:0:($test-1)}
line=$(echo ${line:$test})

EOF
done < file_with_values
) > $OUTFILE

o que posso estar fazendo errado?

    
por wzzrd 05.08.2009 / 13:39

4 respostas

2

Você não pode escrever um script dentro de um bloco de dados em linha (< < EOF)

Tente algo assim:

OUTFILE=file3.txt

while IFS=, read a b; do
    echo "first number: $a"
    echo "second number: $b"

    # you can call runnable here, for example if you want to give it one number at a time:

    echo "$a" | ./runnable input
    echo "$b" | ./runnable input

    # or something like this:

    ./runnable "$a" "$b"

done >$OUTFILE
    
por 05.08.2009 / 14:07
1

Tente dividir a linha de maneira fácil, fazendo um array fora da linha que você leu, assim (onde your_line é a linha que você leu no arquivo).

OIFS=${IFS}
IFS=','
your_line=(${your_line})
IFS=${OIFS}

Agora $ {your_line [0]} é o primeiro número, $ {your_line [1]} o segundo. Você pode ecoá-los, adicioná-los, o que for. Isso provavelmente funcionará bem.

Os scripts inteiros se tornariam algo nos moldes de:

#!/bin/bash

cat FILE_WITH_VALUES | while read your_line; do

    OIFS=${IFS}
    IFS=','
    your_line=(${your_line})
    IFS=${OIFS}

    echo ${your_line[0]} ${your_line[1]} | ./runnable_input >> OUTPUT_FILE

done

A desvantagem é que isso iniciará runnable_input 100 vezes (uma vez para cada linha). Em uma máquina razoavelmente rápida, 100 execuções para uma entrada tão pequena não importariam, a menos que runnable_input dependesse de obter 100 linhas por vez.

    
por 05.08.2009 / 14:00
1

Pré-processe seus 100 arquivos em um arquivo de dados e trabalhe com ele

#!/usr/bin/bash

OUTFILE=xyzzy
(
while read line 
do
./runable $line
done <datafile
)>$OUTFILE
    
por 05.08.2009 / 14:08
0

Tente este script,

#!/bin/sh
IFS="
"
for i in $( sed 's|,| |g' file_with_values );
do
    ./runnable $i
done > file3.txt
    
por 05.08.2009 / 13:56