Com bash, zsh, GNU echo ou algumas implementações de ksh em alguns sistemas, isso pode ser decodificado simplesmente por echo -e após a substituição de todos os % por \x .
url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\x}
printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B
echo -e "$temp_string"
# output: ресурсы
(Assume-se que a string em si não contém caracteres de barra invertida e não é uma das opções suportadas pelo seu comando echo )
Como @JoshLee também aponta, a "ressalva de eco" pode ser evitada usando diretamente:
printf ${url_encoded_string//%/\x}
diretamente atrás do primeiro comando.