2015-03-01 2 views
1

Я создал сценарий, который обращается к веб-сайту с использованием файла данных и выводит ответы сайтов (одна строка XML) в выходной файл. Я хотел бы, чтобы результат начинался с запроса файла данных, а затем на ответ веб-сайта. Когда я повторяю запрос одной строкой и записываю его в выходной файл, а затем пишу ответ сайта в тот же выходной файл, он использует две строки, но мне нужна только одна строка, потому что я хотел бы получить файл с запятой, который я может импортировать в excel.Сценарий оболочки Linux, используйте переменную более одного раза

Это работает, но с наличием двух строк данных:

while read -r line || [[ -n $line ]] 
do 
datatogather="$line" 
echo $datatogather >>outputfile.txt 
curl http://login:[email protected]/application.php?$datatogather >>outputfile.txt 
echo >>outputfile.txt 
done < datafile.txt 

Это не работает (хотя это показывает, запятая в выходном файле, так что строка обрабатывается):

while read -r line || [[ -n $line ]] 
do 
datatogather="$line" 
echo $datatogather,>>outputfile.txt | curl http://login:[email protected]/application.php?$datatogather >>outputfile.txt 
echo >>outputfile.txt 
done < datafile.txt 

Зачистка выходного файла его мусорными данными с помощью sed была легкой, чтобы понять, даже чтение входного файла на сайт было очень легко по сравнению с выяснением того, как использовать переменную более одного раза в одной строке. Надеюсь, ты поможешь мне.

ответ

1

Сделайте одну echo операцию вместо двух, и только один Перенаправление вместо многих, и использовать command substitution захватить выход curl:

while read -r line && [[ -n "$line" ]] 
do 
    echo "$line,$(curl http://login:[email protected]/application.php?$line)" 
done <datafile.txt>>outputfile.txt 

Обратите внимание, что тест изменяется от || к &&, и лично Мне не нравятся некотируемые переменные, хотя [[ менее проблематичен в некоторых отношениях, чем [ (но вводит другие проблемы, IMO).

Единственная неприятная особенность заключается в том, что двойные кавычки означают, что символы новой строки в ответе веб-сайта сохраняются на выходе. Если вам нравится жить опасно, вы можете просто удалить двойные кавычки. Вероятно, было бы лучше, чтобы пересмотреть его для отображения строк пробелами:

while read -r line && [[ -n "$line" ]] 
do 
    echo "$line,$(curl http://login:[email protected]/application.php?$line | tr '\n' ' ')" 
done <datafile.txt>>outputfile.txt 

Обратите внимание, что вы подвержены иметь проблемы, если выход с веб-сайта включает в себя запятые в своей продукции, но вы не имеете (все же) спросил об этом.

Вы не хотите, чтобы операция tr находилась вне цикла; вы хотите новую строку в конце каждого echo, так что это было бы плохо:

while read -r line && [[ -n "$line" ]] 
do 
    echo "$line,$(curl http://login:[email protected]/application.php?$line)" 
done < datafile.txt | tr '\n' ' ' >>outputfile.txt 

+0

Вы изменили 'чтения -r линии || [[$ line]] 'в' read -r line && [[$ line]] '. Это полностью меняет смысл кода. –

+0

Первый случай - это способ иметь дело с [неполными строками] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_194) - и, следовательно, файлы, которые не являются [текстовым файлом] (http : //pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap03.html#tag_21_03_00_68) (Мне действительно не нравится тот факт, что все больше и больше людей думают, что это умный и выглядит классно, чтобы читать '-r line || [ [$ line]] ', когда они даже не знают, что такое [строка] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_205). –

+0

Последний случай нарушит петля, как только есть пустая строка (или на неполных строках). –

Смежные вопросы