Получение параметров из файла через скрипт оболочки в скрипт Python в нужном формате

1

У меня есть следующая оболочка script:

#! /bin/sh

while read page_section
  page=${page_section%%\ *}
  section=${page_section#* }     #NOTE: `%* }` is NOT a comment

  wget --quiet --no-proxy www.cs.sun.ac.za/hons/$page -O html.tmp & wait

#  echo ${page_section%%\ *} # verify correct string chopping
#  echo ${page_section#* }   # verify correct string chopping

  ./DokuWikiHtml2Latex.py html.tmp $section & wait
done < inputfile

И входной файл, подобный этому:

doku.php?id=ndewet:tools:tramonitor TraMonitor
doku.php?id=ndewet:description Implementation -1
doku.php?id=ndewet:description Research\ Areas -1

script загружает несколько веб-страниц, выделенных в inputfile, и затем должен передать оставшуюся часть строки (например, "Реализация -1" или "Исследование\Области -1" ) на python script.

Теперь за липкий бит. Когда третья строка этого файла примера обрабатывается, он передает "Research\Areas" в python script как два отдельных аргумента, что подтверждается:

>>> print sys.argv
['./DokuWikiHtml2Latex.py', 'html.tmp', 'Research', 'Areas', '-1']

Как я могу получить раздел нескольких слов, например "Области исследований" из входного файла, в один аргумент для python script? Я попытался выйти из "\", а также сделать

./DokuWikiHtml2Latex.py html.tmp `echo ${section#* }`

между прочим, но безрезультатно.

Число в конце строки ввода - это еще один аргумент, но необязательный.

Теги:
argument-passing

3 ответа

1
Лучший ответ

Просто дайте read выполнить разбор:

while read page section rest
do
    echo "Page: $page"
    echo "Section: $section"
done < inputfile

Для правильной обработки необязательного аргумента используйте массив:

while read -a fields
do
    wget --quiet --no-proxy "www.cs.sun.ac.za/hons/${fields[0]}" -O html.tmp
    unset "fields[0]"
    ./DokuWikiHtml2Latex.py html.tmp "${fields[@]}"
done < inputfile

Всегда указывайте свои переменные!

  • 0
    Вы должны помещать кавычки вокруг элементов массива, которые вы отключили, чтобы защитить их от глобализации: unset "fields[0]" (если есть файл с именем «fields0»). Демо: test=(1 2 3); touch test0; unset test[0]; declare -p test; unset "test[0]"; declare -p test
  • 0
    @ Денис Уильямсон: Спасибо.
Показать ещё 1 комментарий
2

Поместите кавычки вокруг $section:

./DokuWikiHtml2Latex.py html.tmp "$section" & wait
0

Обычно аргументы с несколькими словами могут передаваться как один с помощью кавычек, поэтому:

doku.php?id=ndewet:description "Research Areas" -1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню