URL以便携方式编码shell脚本中的字符串

时间:2016-06-24 13:59:36

标签: linux shell posix urlencode

我需要使用shell函数对字符串进行URL编码,该函数将在BusyBox Ash,Dash,Bash和ZSH中运行。

它将在不同的Docker容器中运行,因此尽可能少地安装依赖项会很好。

注意:

  • 问题“URL encoding a string in bash script”要求提供特定于Bash的脚本,唯一提供的答案取决于容器上安装的PHP。

  • 问题“How to urlencode data for curl command?”特定于 curl ,但肯定对非特定答案持开放态度。但是,25个答案似乎都不适用。其中一个答案只能将数据发送到 curl ,而有些是针对 bash ksh ,其他一些需要 Perl PHP Python Lua NodeJS Ruby gridsite-clients uni2ascii jq awk sed 是安装。其中一个不需要额外的依赖项,但不保留a1~等字符。

我期望得到的东西:

$> urlencode '/'
%2f

$> urlencode 'ç'
%c3%a7

$> urlencode '*'
%2a

$> urlencode abc-123~6
abc-123~6

$> urlencode 'a test ?*ç '
a%20test%20%3f%2a%c3%a7%20

1 个答案:

答案 0 :(得分:2)

以下功能已经在 BusyBox Ash Dash Bash ZSH 进行了测试。

他们只使用shell内置命令或核心命令,并且也应该在其他shell中工作。

urlencodepipe() {
  local LANG=C; local c; while IFS= read -r c; do
    case $c in [a-zA-Z0-9.~_-]) printf "$c"; continue ;; esac
    printf "$c" | od -An -tx1 | tr ' ' % | tr -d '\n'
  done <<EOF
$(fold -w1)
EOF
  echo
}

urlencode() { printf "$*" | urlencodepipe ;}

工作原理:

  • 标准输入由fold -w1处理,重新格式化其输入,使其为1列宽(换句话说,在每次输入后添加\n字符,以便每个字符都在自己的行上)
  • 此处文档<<EOFfold的输出提供给read命令
  • while命令从read命令一次接受一行(只有1个字符宽),该命令从fold获取输入,并将其分配给变量{ {1}}
  • c测试该字符是否需要进行网址编码。如果没有,则打印并继续while循环
  • od将每个输入字符转换为十六进制
  • case将空格转换为tr并加入多行