чтение файла строка за строкой из сценария оболочки - PullRequest
3 голосов
/ 04 февраля 2010

Я столкнулся с проблемой в сценарии оболочки bash. Предполагается, что этот сценарий выполняет другой сценарий оболочки (здесь ./script), а выходные данные сценария перенаправляются в файл (tmp). Затем файл должен читаться построчно, и для каждой из строк должен выполняться один и тот же скрипт (./ script), в котором строка указывается в качестве аргумента, а результат должен храниться в файле (tmp1). В конечном итоге эти результаты должны быть добавлены в первый файл (tmp).

Я вставляю свой скрипт ниже:

./script $1 $2 > tmp
cat tmp | while read a
do
 ./script $a $2 >> tmp1
done

cat tmp1 | while read line
do
 ./script $line $2 >> tmp
done

Я получаю следующую ошибку при выполнении сценария "./script: строка 11: синтаксическая ошибка: неожиданный конец файла"

Может кто-нибудь помочь мне в этом ??

Заранее большое спасибо.

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

Файл скрипта имеет окончания строки DOS / Windows.Попробуйте эту команду, затем запустите ваш скрипт:

dos2unix ./script

Возможно, вы редактируете файл с помощью редактора Windows, и это добавляет \r (0x0d) в конец каждой строки.Это можно удалить с помощью dos2unix.

1 голос
/ 04 февраля 2010

потерять всех кошек!они не нужны.И я полагаю, что summ_tmp - это существующий файл?

#!/bin/bash
set -x
./wiki $1 $2 > tmp
while read -r a
do
    ./wiki $a $2 >> tmp1
done < summ_tmp

while read -r line
do
    ./wiki $line $2 >> tmp
done < tmp1

С тем, что вы делаете, вы можете реорганизовать ваш "./script", чтобы исключить ненужные шаги.Если это не слишком долго, покажите, что делает ваш "./script".Покажите желаемый вывод и покажите примеры соответствующих входных файлов, где это возможно

Поместите set -x в ваш скрипт (wiki и ./script), чтобы помочь вам в отладке.

1 голос
/ 04 февраля 2010

Оболочка обычно расщепляется на пустом месте. Вы можете разделить его на новые строки, написав, к началу,

IFS='
'

Тем не менее, я думаю, что то, что вы пытаетесь сделать, может не подходить для shell и может лучше обслуживаться Perl или Ruby.

0 голосов
/ 04 февраля 2010

В качестве альтернативы вы можете использовать xargs - он выполняет команду для каждой строки в файле, что именно то, что вы хотите.

Вы можете заменить

cat tmp1 | while read line
do
    ./script $line $2 >> tmp
done

на

xargs <tmp1 -n1 -IXXX ./script XXX $2 >>tmp

-n1 означает чтение по одной строке за раз от ввода,

-IXXX означает замену XXX строкой, которая была прочитана - по умолчанию добавляется ее в конецкомандная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...