dimayakovlev.ru


Кодирование и декодирование 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

Пример использования функции urlencode в Bash

Декодирование кодированного URL-адреса, присвоенного переменной URLCODED:

URL="https://мой-сайт.рф/index.php?id=Главная&p=1"
URLCODED=$(urlencode $URL)
urldecode $URLCODED

Пример использования функции urldecode в Bash