Как обойти амперсанд (&) без использования кавычек при получении URL-адреса в качестве аргумента сценария оболочки? - PullRequest
0 голосов
/ 22 декабря 2019

Я создаю сценарий оболочки (пытаюсь быть совместимым с POSIX) и застрял в проблеме. Сценарий должен получить URL-адрес и выполнить некоторые действия с его содержимым.

myscript www.pudim.com.br/?&args=ok

Дело в том, что символ амперсанда интерпретируется как добавление команды, а моему сценарию предоставляется только часть www.pudim.com.br/?в качестве аргумента.

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

Есть ли какой-нибудь способ получить полный аргумент URL, каким-то образом минуя амперсанд?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2019

Котировки для полного URL

Завершение URL в кавычках будет вашим единственным шансом. См. Популярную утилиту оболочки curl , в которой говорится об основном аргументе URL:

При использовании последовательностей [] или {} при вызове из командной строки вам, вероятно, придетсяпоместите полный URL в двойные кавычки, чтобы оболочка не мешала ему. Это также относится и к другим специальным символам, таким как, например, '&', '?'и '*'.

См. также этот вопрос и , .

Дополнительные аргументы для указания параметров запроса

Вы также можете передать параметр запроса (пара ключ-значение) в качестве отдельного аргумента. Таким образом, вы можете обойти & в качестве разделителя. См. Параметр curl -F:

-F, --form

Чтение URL-адреса из STDIN

Если ваш сценарий разрешает взаимодействие с пользователем, вы можете read URL-адрес без экранирования (включая metachars как &) из неинтерпретированного источника ввода. Смотрите этот учебник .

0 голосов
/ 22 декабря 2019

Вы можете убежать просто амперсанд;кавычки эффективно экранируют каждый символ между ними.

myscript www.pudim.com.br/\?\&args=ok  # The ? should be escaped as well

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

myscript www.pudim.com.br/? &
args=ok

Unescaped, ? приведет к тому, что URL будет рассматриваться как шаблон для расширения. Однако маловероятно, что шаблон будет соответствовать какому-либо существующему файлу, и поведение по умолчанию bash заключается в буквальном обращении с непревзойденным шаблоном. (Параметр failglob будет рассматривать его как ошибку, а параметр nullglob приведет к тому, что URL-адрес полностью исчезнет из командной строки, но ни один из параметров не будет включен по умолчанию.)

...