не удалось передать wget переменную с кавычками внутри переменной

Я пытаюсь написать команду wget для загрузки веб-страницы и всех ее вложений, файлов в формате jpeg и т. д.

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

Моя проблема заключалась в изменении параметров сеанса.

Мой сценарий пока выглядит следующим образом:

cnt=35209
# initialise the headers
general_settings='-4 -P xyz --restrict-file-names=windows -nc --limit-rate=250k'
html_page_specific='--convert-links --html-extension'
proxy='--proxy-user=xxxxxx --proxy-password=yyyyyyy' 
session="--header=\'Host: mywebsite.com:9090\' --header=\'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0\'"
address=http://mywebsite.com:9090/browse/item-$cnt

echo $general_settings $proxy $session $cookie $address
echo
echo
echo Getting item-$cnt...

#while [ $cnt -gt 0 ]
#do
#  # get the page
  wget --debug $general_settings $html_page_specific $proxy $session $cookie $address

  # now get the attachments, pdf, txt, jpg, gif, sql, etc...
#  wget -A.pdf  $general_settings -r $proxy $session $cookie $address
#  wget -A.txt  $general_settings -r $proxy $session $cookie $address
#  wget -A.jpg  $general_settings -r $proxy $session $cookie $address
#  wget -A.gif  $general_settings -r $proxy $session $cookie $address
#  wget -A.sql  $general_settings -r $proxy $session $cookie $address
#  wget -A.doc  $general_settings -r $proxy $session $cookie $address
#  wget -A.docx $general_settings -r $proxy $session $cookie $address
#  wget -A.xls  $general_settings -r $proxy $session $cookie $address
#  wget -A.xlsm $general_settings -r $proxy $session $cookie $address
#  wget -A.xlsx $general_settings -r $proxy $session $cookie $address
#  wget -A.xml  $general_settings -r $proxy $session $cookie $address
#  wget -A.ppt  $general_settings -r $proxy $session $cookie $address
#  wget -A.pptx $general_settings -r $proxy $session $cookie $address
#  wget -A.png  $general_settings -r $proxy $session $cookie $address
#  wget -A.ps   $general_settings -r $proxy $session $cookie $address
#  wget -A.mdb  $general_settings -r $proxy $session $cookie $address
#  ((cnt=cnt-1))
#
#done

но когда я запускаю скрипт, я получаю следующий вывод

Getting item-35209...
Setting --inet4-only (inet4only) to 1
Setting --directory-prefix (dirprefix) to xyz
Setting --restrict-file-names (restrictfilenames) to windows
Setting --no (noclobber) to 1
Setting --limit-rate (limitrate) to 250k
Setting --convert-links (convertlinks) to 1
Setting --html-extension (htmlextension) to 1
Setting --proxy-user (proxyuser) to xxxxx
Setting --proxy-password (proxypassword) to yyyyy
Setting --header (header) to \'Host:
Setting --header (header) to 'Cookie:
DEBUG output created by Wget 1.11.4 Red Hat modified on linux-gnu.

Как видите, разделы Host и Cookie неправильно отформатированы, в результате чего команде wget не удается войти в систему и извлечь данные.

Я читал справочные страницы bash, гуглил и пробовал несколько связанных предложений от SO, но я все еще не могу выполнить команду.

Кто-нибудь будет достаточно любезен, чтобы показать мне, как правильно цитировать цитаты в veriables?

Спасибо,


person dhevans79    schedule 06.05.2013    source источник


Ответы (2)


Кавычки внутри строк или переменных в кавычках — это обычные символы, а не символы кавычек. Это невозможно изменить. Вместо этого используйте массив:

A=(a b 'c d' 'e f')
cmd "${A[@]}"

вызывает cmd с четырьмя аргументами a, b, c d и e f.

(Вы могли бы добиться аналогичного эффекта с eval, но это намного более подвержено ошибкам. В вашем случае использование массивов намного удобнее.)

person Uwe    schedule 06.05.2013
comment
Уве, извините за глупость, но я не вижу, как это будет иметь какое-либо значение, поскольку мои строки содержат кавычки, т.е. --header=\'Host: mywebsite.com:9090\'. будет вводить значение переменной в массив, чтобы кавычки правильно читались Bash? - person dhevans79; 06.05.2013
comment
Или формат, который я использую, правильный, и что, используя массив, Bash начнет их правильно интерпретировать? - person dhevans79; 06.05.2013
comment
Определите session=(--header='Host: mywebsite.com:9090' --header='User-Agent: ... Firefox/20.0'), а затем используйте "${session[@]}" вместо $session. Аналогично должны быть изменены и другие переменные. - person Uwe; 06.05.2013
comment
Спасибо, отлично. Теперь мне нужно исследовать, как работают массивы, чтобы я действительно понял, что это делает. Большое спасибо за ответ и пример. - person dhevans79; 06.05.2013

session="--header=Host: mywebsite.com:9090 --header=User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0"

использовать это,

person abasu    schedule 06.05.2013
comment
Если вы сделаете это, то wget будет вызываться либо с отдельными аргументами --header=Host:, mywebsite.com:9090, --header=User-Agent:, Mozilla/5.0 и т. д. (если используется $session), либо с одним единственным аргументом --header=Host: ... Firefox/20.0 (если используется "$session"). Ни один из них не делает того, что предполагалось, то есть вызова с двумя аргументами --header=Host: mywebsite.com:9090 и --header=User-Agent: Mozilla/5.0 ... Firefox/20.0. - person Uwe; 06.05.2013
comment
комментарий выше правильный. Это именно то, что я вижу в выводе, когда пробовал это до того, как задал вопрос о SO. - person dhevans79; 06.05.2013