diff --git a/README.md b/README.md index 78846bd..cbe60ad 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ See something incorrectly described, buggy or outright wrong? Open an issue or s * [Strip first occurrence of pattern from string](#strip-first-occurrence-of-pattern-from-string) * [Strip pattern from start of string](#strip-pattern-from-start-of-string) * [Strip pattern from end of string](#strip-pattern-from-end-of-string) + * [Percent-encode a string](#percent-encode-a-string) + * [Decode a percent-encoded string](#decode-a-percent-encoded-string) * [Check if string contains a sub-string](#check-if-string-contains-a-sub-string) * [Check if string starts with sub-string](#check-if-string-starts-with-sub-string) * [Check if string ends with sub-string](#check-if-string-ends-with-sub-string) @@ -483,6 +485,56 @@ $ rstrip "The Quick Brown Fox" " Fox" The Quick Brown ``` +## Percent-encode a string + +**Example Function:** + +```sh +urlencode() { + # Usage: urlencode "string" + local LC_ALL=C + for (( i = 0; i < ${#1}; i++ )); do + : "${1:i:1}" + case "$_" in + [a-zA-Z0-9.~_-]) + printf '%s' "$_" + ;; + + *) + printf '%%%02X' "'$_" + ;; + esac + done + printf '\n' +} +``` + +**Example Usage:** + +```shell +$ urlencode "https://github.com/dylanaraps/pure-bash-bible" +https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible +``` + +## Decode a percent-encoded string + +**Example Function:** + +```sh +urldecode() { + # Usage: urldecode "string" + : "${1//+/ }" + printf '%b\n' "${_//%/\\x}" +} +``` + +**Example Usage:** + +```shell +$ urldecode "https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible" +https://github.com/dylanaraps/pure-bash-bible +``` + ## Check if string contains a sub-string **Using a test:** diff --git a/manuscript/chapter1.txt b/manuscript/chapter1.txt index 1dd4b05..a64e4a4 100644 --- a/manuscript/chapter1.txt +++ b/manuscript/chapter1.txt @@ -308,6 +308,55 @@ $ rstrip "The Quick Brown Fox" " Fox" The Quick Brown ``` +## Percent-encode a string + +**Example Function:** + +```sh +urlencode() { + # Usage: urlencode "string" + for (( i = 0; i < ${#1}; i++ )); do + : "${1:i:1}" + case "$_" in + [a-zA-Z0-9.~_-]) + printf '%s' "$_" + ;; + + *) + printf '%%%02X' "'$_" + ;; + esac + done + printf '\n' +} +``` + +**Example Usage:** + +```shell +$ urlencode "https://github.com/dylanaraps/pure-bash-bible" +https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible +``` + +## Decode a percent-encoded string + +**Example Function:** + +```sh +urldecode() { + # Usage: urldecode "string" + : "${1//+/ }" + printf '%b\n' "${_//%/\\x}" +} +``` + +**Example Usage:** + +```shell +$ urldecode "https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible" +https://github.com/dylanaraps/pure-bash-bible +``` + ## Check if string contains a sub-string **Using a test:** diff --git a/manuscript/chapter6.txt b/manuscript/chapter6.txt index 88e4b08..33621cb 100644 --- a/manuscript/chapter6.txt +++ b/manuscript/chapter6.txt @@ -21,7 +21,7 @@ $ hello_world="value" $ var="world" # Declare a nameref. -$ declare -n "ref=hello_$var" +$ declare -n ref=hello_$var $ printf '%s\n' "$ref" value @@ -31,7 +31,7 @@ value ```shell $ var="world" -$ declare hello_$var=value +$ declare "hello_$var=value" $ printf '%s\n' "$hello_world" value ``` diff --git a/test.sh b/test.sh index 01020f3..e14553a 100755 --- a/test.sh +++ b/test.sh @@ -53,6 +53,16 @@ test_rstrip() { assert_equals "$result" "Hello" } +test_urlencode() { + result="$(urlencode "https://github.com/dylanaraps/pure-bash-bible")" + assert_equals "$result" "https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible" +} + +test_urldecode() { + result="$(urldecode "https%3A%2F%2Fgithub.com%2Fdylanaraps%2Fpure-bash-bible")" + assert_equals "$result" "https://github.com/dylanaraps/pure-bash-bible" +} + test_reverse_array() { IFS=$'\n' read -d "" -ra result < <(reverse_array 1 2 3 4 5) assert_equals "${result[*]}" "5 4 3 2 1"