, как предложено в комментариях @Roadowl, сам bash может urlencode данных, вызов wget может выглядеть как
wget --post-data=$(printf "url="; urlencode $u) http://example.com
с использованием реализации urlencode из https://gist.github.com/cdown/1163649,
urlencode() {
# urlencode <string>
old_lc_collate=$LC_COLLATE
LC_COLLATE=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
LC_COLLATE=$old_lc_collate
}
.. вероятно, не будет работать с нулевыми байтами, хотя, учитывая, что bash не любит нулевые байты и, вероятно, не допустит их в переменных