2016-06-24 5 views
0

BusyBox Ash、Dash、Bash、ZSHで動作するシェル関数を使用してURLエンコードする必要があります。ポータブルな方法でシェルスクリプトに文字列をエンコードする

これは異なるDockerコンテナで実行されるため、できるだけインストールする依存関係が少ない方がよいでしょう。

注:

  • 質問「URL encoding a string in bash scriptは」バッシュ固有のスクリプトを要求し、そして唯一の提供答えはPHPがコンテナにインストールされているに依存します。

  • How to urlencode data for curl command?」という質問は、curlに固有ですが、非特定回答には確かです。しかし、25の答えのどれも適用されないようです。そこの答えの一つだけカールにデータを送信するために動作しますが、いくつかは、bashのまたはkshのに固有のものですが、いくつか他の人がを必要とPerlのPHPPythonのLuaのNodeJSルビーgridsite-clients、uni2ascii、JQawkの O r sedをインストールしてください。そのうちの1つは追加の依存関係を必要としませんが、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複製の外観であるように思わHexに各入力文字を変換し続けています:/を/stackoverflow.com/questions/296536/how-to-urlencode-data-for-curl-command – OkieOth

答えて

0

以下BusyBoxのアッシュダッシュバッシュZSHでテストされている機能。

これらは、シェル組み込み関数またはコアコマンドのみを使用し、他のシェルでも動作するはずです。

仕組み
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 ;} 

  • 標準入力は、換言すれば、各後\nを付加する再フォーマットその入力が1列幅であるように(、fold -w1によって処理され
  • ここでの文書<<EOFは、foldの出力をreadコマンド
  • に送ります(入力した文字は各自の行に表示されます)。 210
  • whileコマンドがfoldから入力を取得するreadコマンドから(わずか1文字幅である)一度に一つの行を受け入れ、その文字はURLエンコードする必要がある場合、変数c
  • caseテストに割り当て。そうでない場合は、それを印刷し、whileループは
  • od
  • tr%にスペースを変換し、複数行
関連する問題