无法从变量获取 JSON 值

无法从变量获取 JSON 值

我编写了小型 Shell/bash 脚本,其中文件中有一些数据sampleData.txt,我想将其转换为 Base64 并将其传递到变量中$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 

假设您使用的是诸如 之类的 shell bash,这可以写为

encoded=$( base64 <<<"$value" )

甚至

encoded=$( base64 <sampleData.txt )

它使用命令替换将文件中数据的 Base64 编码捕获sampleData.txt到变量中,其方式与您在第一行代码的命令替换中encoded使用的方式类似。cat

由于变量不会在单引号字符串中扩展,因此代码

scriptPayload='{"scriptText":"$encoded" }'

不会做你认为它会做的事情(它设置scriptPayload为文字 string {"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"

参数scriptText=%sampleData.txt告诉jo我们用 key 创建一个 JSON 对象scriptText。该密钥的数据应该是文件的 base64 编码内容sampleData.txt(它%决定它应该是 base64 编码)。

sampleData.txt对于包含字符串Hello World(后跟换行符)的文件,这将输出

{"scriptText":"SGVsbG8gV29ybGQK"}

jo是一个在命令行或 shell 脚本中轻松创建正确编码和引用的 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"

尝试上面的代码。您的变量未计算的原因是您将其封装在单引号内。我碰巧在变量之前关闭单引号。这样 shell 就会识别一个变量并将其替换为实际内容。

相关内容