Как кодировать URL в скрипте bash? - PullRequest
0 голосов
/ 17 января 2011

РЕДАКТИРОВАТЬ (дополнительный вопрос)

Может кто-нибудь объяснить, что делает эта строка?

eval website=\${$#}

Скрипт читает много параметров, он называется примерно так

. / Script.sh -t 30 -n 100 -a тест http://www.google.com

У меня проблемы с чтением URL (http://www.google.com)


Я открываю firefox, используя URL-адреса, переданные скрипту bash. Как мне их кодировать? Некоторые из этих URL-адресов вызывают проблемы.

Какой-то код

eval website=\${$#} // takes as argument

firefox -width 1280 -height 8000 ${website} &

проблемный URL

http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/1$41912

В Firefox он открывается как

http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/141912

$ знак удаляется

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Никогда не используйте eval и всегда заключайте в кавычки ваши переменные.Первый аргумент хранится в параметре 1:

firefox "$1" &
2 голосов
/ 17 января 2011

Самый простой способ - это избежать символов, вызывающих некоторые проблемы.

Если ваш URL не содержит необычных символов, таких как ' или \, все будет в порядке, просто поместив ваш URL между буквой ':

$ firefox 'YOUR_URL'

Это предотвратит оценку YOUR_URL содержимого.


Изменить , чтобы отразить обновленный ответ:

Используя команду echo, вы можете увидеть, как bash расширяет ваши параметры.

В вашем примере bash думает, что $ используется для идентификации переменной (переменная с именем 4), поэтому он заменяет $4 значением переменной 4, которое не определено (таким образом, просто удаляет $4):

$ echo http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/1$41912
http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/11912
$ echo 'http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/1$41912'
http://www.airportbusiness.com//print/Airport-Business-Magazine/Expo-Returns-to-Vegas/1$41912
1 голос
/ 17 января 2011

Эта строка:

eval website=\${$#}

устанавливает переменную в последний позиционный параметр, независимо от того, сколько их.

Измените его на:

website=${@: -1}

это, кстати, башизм.

Вот несколько других Bashisms, которые выполняют то же самое:

echo "${!#}"
echo "${@:$#}"
echo "${BASH_ARGV[0]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...