我需要使用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 是安装。其中一个不需要额外的依赖项,但不保留a
,1
和~
等字符。
我期望得到的东西:
$> 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
答案 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
字符,以便每个字符都在自己的行上)<<EOF
将fold
的输出提供给read
命令while
命令从read
命令一次接受一行(只有1个字符宽),该命令从fold
获取输入,并将其分配给变量{ {1}} c
测试该字符是否需要进行网址编码。如果没有,则打印并继续while循环case
将空格转换为tr
并加入多行