Назад | Перейти на главную страницу

ошибка сценария bash

У меня был следующий сценарий bash, который работал нормально.

#!/bin/bash

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

но позже мне потребовалось изменить аргументы. в каталоге 100 файлов, каждый файл имеет два номера. эти два числа необходимо передать в указанный выше сценарий. В 100 файлах есть такие данные:

2,4
9,2
4,2

поэтому я изменил сценарий на следующий, но это, похоже, не работает.

#!/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

что я могу делать не так?

Вы не можете написать скрипт внутри встроенного блока данных (<< EOF)

Попробуйте что-то вроде этого:

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

Предварительно обработайте ваши 100 файлов в 1 файл данных, а затем работайте с этим

#!/usr/bin/bash

OUTFILE=xyzzy
(
while read line 
do
./runable $line
done <datafile
)>$OUTFILE

Попробуйте легко разделить строку, сделав массив из строки, которую вы читаете, например (где your_line - это строка, которую вы читаете из файла).

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

Теперь $ {your_line [0]} - это первое число, $ {your_line [1]} - второе. Вы можете повторить их, добавить их, что угодно. Вероятно, это сработает.

Полные скрипты станут чем-то вроде:

#!/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

Обратной стороной является то, что runnable_input будет запускаться 100 раз (по одному для каждой строки). На достаточно быстрой машине 100 запусков для такого небольшого ввода не имеют значения, если только runnable_input не зависит от получения 100 строк за раз.

Попробуйте этот сценарий,

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