У меня есть следующая оболочка 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#* }`
между прочим, но безрезультатно.
Число в конце строки ввода - это еще один аргумент, но необязательный.
Просто дайте 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
Всегда указывайте свои переменные!
Поместите кавычки вокруг $section:
./DokuWikiHtml2Latex.py html.tmp "$section" & wait
Обычно аргументы с несколькими словами могут передаваться как один с помощью кавычек, поэтому:
doku.php?id=ndewet:description "Research Areas" -1
unset "fields[0]"
(если есть файл с именем «fields0»). Демо:test=(1 2 3); touch test0; unset test[0]; declare -p test; unset "test[0]"; declare -p test