Bash shell 使用 CURL urlencode 送參數

Bash shell 想要送中文等需要被 urlencode 過的文字到網址去,要怎麼做呢?

此篇使用 curl 直接傳送,另外在紀錄 Bash 的 urlencode() / urldecode() 寫法

Bash shell 使用 CURL urlencode 送參數

CURL 想要做 urlencode,需要搭配 --data-urlencode 的參數(--data-urlencode 需要另外搭配 -G),另外不需要 encode 的,一樣可以帶在網址後面即可。

直接看範例比較容易懂,下述範例要傳送三個參數:msg、text、channel,channel 不需要 urlencode,先直接帶在後面即可。

  • curl -X GET -G --data-urlencode "msg=abcs" --data-urlencode "text=中文" "http://example.com/?channel=blog"
  • 註:若需要 POST,則 -X POST,所有參數都需要加到 --data-urlencode 去。

若不使用 curl,想要於 Bash shell 直接轉譯傳送,下面有兩種 urlencode() 的寫法(將下述寫入 .bashrc 即可),自行挑其一使用:

Bash shell 使用 curl 來達成 urlencode 所需命令

  1. function urlencode() {
  2. local data
  3. if [[ $# != 1 ]]; then
  4. echo "Usage: $0 string-to-urlencode"
  5. return 1
  6. fi
  7. data="$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")"
  8. if [[ $? != 3 ]]; then
  9. echo "Unexpected error" 1>&2
  10. echo "${data##/?}"
  11. return 0
  12. }

使用方式

  • $ echo http://example.com/q?=$( urlencode "中文" )

Bash shell 的 urlencode() / urldecode()

下述整理自此篇:Bash urlencode and urldecode # 註:此篇最上面的不能用,往下翻的才有正確能用的版本

Bash shell 使用 xxd 來達成 urlencode 所需計算

  1. function urlencode() {
  2. local length="${#1}"
  3. for (( i = 0; i < length; i++ )); do
  4. local c="${1:i:1}"
  5. case $c in
  6. [a-zA-Z0-9.~_-]) printf "$c" ;;
  7. *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
  8. esac
  9. done
  10. }
  1. function urldecode() {
  2. # urldecode <string>
  3. local url_encoded="${1//+/ }"
  4. printf '%b' "${url_encoded//%/\\x}"
  5. }

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料