Кодирование и декодирование URL-адресов в Bash
При работе с URL-адресами в Bash может возникнуть необходимость закодировать или декодировать адрес. Для этого можно использовать разные инструменты, например, передать URL-адрес в сценарий на языке PHP и выполнить его, но можно решить задачу проще, не прибегая к дополнительным инструментам.
Для работы c URL-адресами предлагаю рассмотреть две функции Bash:
urlencode()
- принимает URL-адрес и кодирует его;urldecode()
- принимает закодированный URL-адрес и декодирует его.
Для удобства восприятия, названия функций повторяют названия аналогичных функций, доступных в языке PHP.
function urlencode() {
# urlencode <string>
local LC_ALL=C
for (( i = 0; i < ${#1}; i++ )); do
: "${1:i:1}"
case "$_" in
[a-zA-Z0-9.~_-])
printf '%s' "$_"
;;
*)
printf '%%%02X' "'$_"
;;
esac
done
printf '\n'
}
function urldecode() {
# urldecode <string>
: "${1//+/ }"
printf '%b\n' "${_//%/\\x}"
}
Поместив код функций в файл ~/.bashrc
, можно вызывать их в сценариях Bash или использовать отдельно, как показано в следующих примерах.
Кодирование URL-адреса, присвоенного переменной URL
:
URL="https://мой-сайт.рф/index.php?id=Главная&p=1"
urlencode $URL
Декодирование кодированного URL-адреса, присвоенного переменной URLCODED
:
URL="https://мой-сайт.рф/index.php?id=Главная&p=1"
URLCODED=$(urlencode $URL)
urldecode $URLCODED