यहाँ शुद्ध बीएएस उत्तर है।
rawurlencode() {
local string="${1}"
local strlen=${#string}
local encoded=""
local pos c o
for (( pos=0 ; pos<strlen ; pos++ )); do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) printf -v o '%%%02x' "'$c"
esac
encoded+="${o}"
done
echo "${encoded}" # You can either set a return variable (FASTER)
REPLY="${encoded}" #+or echo the result (EASIER)... or both... :p
}
आप इसे दो तरीकों से उपयोग कर सकते हैं:
easier: echo http://url/q?=$( rawurlencode "$args" )
faster: rawurlencode "$args"; echo http://url/q?${REPLY}
[संपादित]
यहाँ मैचिंग रॉर्लडब्लास्क () फ़ंक्शन है, जो - सभी विनय के साथ - कमाल है।
# Returns a string in which the sequences with percent (%) signs followed by
# two hex digits have been replaced with literal characters.
rawurldecode() {
# This is perhaps a risky gambit, but since all escape characters must be
# encoded, we can replace %NN with \xNN and pass the lot to printf -b, which
# will decode hex for us
printf -v REPLY '%b' "${1//%/\\x}" # You can either set a return variable (FASTER)
echo "${REPLY}" #+or echo the result (EASIER)... or both... :p
}
मिलान सेट के साथ, अब हम कुछ सरल परीक्षण कर सकते हैं:
$ diff rawurlencode.inc.sh \
<( rawurldecode "$( rawurlencode "$( cat rawurlencode.inc.sh )" )" ) \
&& echo Matched
Output: Matched
और अगर आप वास्तव में महसूस करते हैं कि आपको एक बाहरी उपकरण की जरूरत है (ठीक है, तो यह बहुत तेजी से आगे बढ़ेगा, और बाइनरी फाइलें और ऐसा कर सकता है ...) मुझे यह मेरे OpenWRT राउटर पर मिला ...
replace_value=$(echo $replace_value | sed -f /usr/lib/ddns/url_escape.sed)
जहाँ url_escape.sed एक फ़ाइल थी जिसमें ये नियम शामिल थे:
# sed url escaping
s:%:%25:g
s: :%20:g
s:<:%3C:g
s:>:%3E:g
s:#:%23:g
s:{:%7B:g
s:}:%7D:g
s:|:%7C:g
s:\\:%5C:g
s:\^:%5E:g
s:~:%7E:g
s:\[:%5B:g
s:\]:%5D:g
s:`:%60:g
s:;:%3B:g
s:/:%2F:g
s:?:%3F:g
s^:^%3A^g
s:@:%40:g
s:=:%3D:g
s:&:%26:g
s:\$:%24:g
s:\!:%21:g
s:\*:%2A:g