2016-06-24 28 views
0

我需要使用將在BusyBox Ash,Dash,Bash和ZSH中運行的shell函數對URL進行URL編碼。以便攜方式對shell腳本中的字符串進行編碼

它將在不同的Docker容器中運行,因此儘可能少地依賴安裝是件好事。

注:

  • 問題「URL encoding a string in bash script」要求一個特定的Bash腳本,並僅供答案取決於安裝在容器上的PHP。

  • 問題「How to urlencode data for curl command?」特定於捲曲,但肯定對非特定答案開放。但是,25個答案中沒有一個似乎適用。其中一個答案那裏只能將數據發送到捲曲,而一些特定於慶典KSH,有些則需要的PerlPHP的Python的Lua的NodeJS紅寶石gridsite-clientsuni2asciiJQAWKö r sed待安裝。其中一個不需要額外的依賴關係,但不保留a,1~等字符。

什麼,我期望有:

$> urlencode '/' 
%2f 

$> urlencode 'ç' 
%c3%a7 

$> urlencode '*' 
%2a 

$> urlencode abc-123~6 
abc-123~6 

$> urlencode 'a test ?*ç ' 
a%20test%20%3f%2a%c3%a7%20 
+1

似乎是重複一下這裏的http:/ /stackoverflow.com/questions/296536/how-to-urlencode-data-for-curl-command – OkieOth

回答

0

下面已經Busybox的ash短跑猛砸ZSH被測試的功能。

它們只使用shell內建或核心命令,並且應該在其他shell中使用。

urlencodepipe() { 
    local LANG=C; local c; while IFS= read -r c; do 
    case $c in [a-zA-Z0-9.~_-]) printf "$c"; continue ;; esac 
    printf "$c" | od -An -tx1 | tr ' ' % | tr -d '\n' 
    done <<EOF 
$(fold -w1) 
EOF 
    echo 
} 

urlencode() { printf "$*" | urlencodepipe ;} 

工作原理:

  • 標準輸入由fold -w1,其重新格式化處理其輸入,使得其爲1列寬(換言之,它每後增加了一個\n輸入字符,以便每個字符將在其自己的行上)
  • 此處的文檔<<EOFfold的輸出提供給read命令
  • while命令接受在一次一行(這是隻有1個字符寬)從read命令,它得到從fold其輸入,並且,如果該字符必須是URL編碼分配給可變c
  • case測試。如果沒有,那麼它的印刷和while循環繼續
  • od將每個輸入字符爲十六進制
  • tr轉換空格%,並加入多行
相關問題