我编写了小型 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 就会识别一个变量并将其替换为实际内容。