sampleData.txt
ファイルにいくつかのデータがあり、それをBase64に変換して変数に渡したい小さなShell / bashスクリプトを作成しました$scriptPayload
。
value=$(cat sampleData.txt)
echo "$value"
encoded= echo $value | base64
scriptPayload='{"scriptText":"$encoded" }'
echo "$scriptPayload"
しかし、私が得る出力は、実際には次の変数から値を取得する必要が{"scriptText":"$encoded"}
あります。$encoded
{"scriptText":"Test the Shell Script and its behaviour" }
提案してください。私はここで初めてです。
答え1
あなたのスクリプトに構文エラーがあります(そうではありませんが、確かにあなたが思うように動作しません)。
encoded= echo $value | base64
次のシェルを使用しているとbash
します。
encoded=$( base64 <<<"$value" )
でも
encoded=$( base64 <sampleData.txt )
sampleData.txt
コードの最初の行でコマンド置換をencoded
使用した方法と同様に、コマンド置換を使用してファイル内のデータのBase64エンコーディングを変数としてキャプチャします。cat
変数は一重引用符で囲まれた文字列には展開されないため、コードは
scriptPayload='{"scriptText":"$encoded" }'
あなたが思うように動作しません(scriptPayload
リテラル文字列に設定されています{"scriptText":"$encoded" }
)。
では、bash
次のように書くのが最善です。
printf -v scriptPayload '{"scriptText":"%s"}' "$encoded"
または
printf -v scriptPayload '{"scriptText":"%s"}' "$( base64 <sampleData.txt )"
printf
組み込みユーティリティはbash
変数として直接印刷します-v varname
。
一部のbase64
ユーティリティ実装では、CRLF行の末尾にデータを生成できます。
使用jo
:
scriptPayload=$( jo scriptText=%sampleData.txt )
printf '%s\n' "$scriptPayload"
パラメータはkeyを使用してJSONオブジェクトを作成するようにscriptText=%sampleData.txt
指示します。キーのデータはファイルのbase64でエンコードされたコンテンツでなければなりません(base64でエンコードする必要がある項目が決まります)。jo
scriptText
sampleData.txt
%
sampleData.txt
Hello World
文字列(後に改行)を含むファイルの場合、次のものが出力されます。
{"scriptText":"SGVsbG8gV29ybGQK"}
jo
コマンドラインまたはシェルスクリプトで正しくエンコードされ、引用されたJSONデータを簡単に生成するツールです。
答え2
あなたのエンコーディングラインは何もしなかったので変更しました。また、最後の行を変更してscriptPayload
エスケープを使用しました。
#!/bin/bash
value=5
echo $value
encoded=`echo -n "$value" | base64`
scriptPayload="{\"scriptText\":\"${encoded}\" }"
echo $scriptPayload
答え3
encoded=`base64 -w0 < sampleData.txt`
scriptPayload='{"scriptText":"'"$encoded"'" }'
echo "$scriptPayload"
上記のコードを試してください。変数が評価されない理由は、変数を一重引用符で囲んだからです。変数の前に一重引用符を閉じました。このようにして、シェルは変数を認識し、それを実際の内容に置き換えます。