変数からJSON値を取得できません。

変数からJSON値を取得できません。

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でエンコードする必要がある項目が決まります)。joscriptTextsampleData.txt%

sampleData.txtHello 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"

上記のコードを試してください。変数が評価されない理由は、変数を一重引用符で囲んだからです。変数の前に一重引用符を閉じました。このようにして、シェルは変数を認識し、それを実際の内容に置き換えます。

関連情報