У меня был следующий сценарий 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