shell是否回显完整内容而没有转义字符

Jim*_*een -1 linux bash shell

我的shell脚本如下:

#!/bin/bash
account0=0xf2de2e86b9b634f655e441a4e8353c9bf59352d7
passwd=123456
data={"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}
echo $data
Run Code Online (Sandbox Code Playgroud)

我的期望是(通知"):

{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[0xf2de2e86b9b634f655e441a4e8353c9bf59352d7,123456]}
Run Code Online (Sandbox Code Playgroud)

{jsonrpc:2.0,method:personal_unlockAccount,id:1,params:[0xf2de2e86b9b634f655e441a4e8353c9bf59352d7,123456]}
Run Code Online (Sandbox Code Playgroud)

:我希望使用转义字符,怎么样?像内容插入到xml标签" <![CDATA[..."..]]>"

Cha*_*ffy 5

echo不是你的问题.(这是一个问题,但不是你眼前的问题).

您的问题是您的报价根本没有分配给变量.行情是bash的语法 ; 它将它们作为有关如何解析字符串的说明的一部分进行读取.因此,它们被bash本身使用,并且不被指定为值,除非它们自己被引用或转义.


要使整个文字成为文字,您可以将整行放在单引号中:

data='{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}'
echo "$data"
Run Code Online (Sandbox Code Playgroud)

...或者您可以使用heredoc生成它,但需要付出一些代价来提高效率:

{ IFS= read -r -d '' data || [[ $data ]]; } <<'EOF'
{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}
EOF
echo "$data"
Run Code Online (Sandbox Code Playgroud)

假设您要执行扩展,替换为account0具有相同名称的shell变量的名称,错误的方法是在引用变量之前从单引号上下文切换到双引号上下文:

# BAD: Does not guarantee result is valid JSON
account0=exampleName; passwd=examplePassword
data='{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":["'"$account0"'","'"$passwd"'"]}'
echo "$data"
Run Code Online (Sandbox Code Playgroud)

...或切换到未引用的heredoc(使用<<EOF,不是<<'EOF'):

# BAD: Does not guarantee result is valid JSON
account0=exampleName; passwd=examplePassword
{ IFS= read -r -d '' data || [[ $data ]]; } <<EOF
{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":["$account0","$passwd"]}
EOF
echo "$data"
Run Code Online (Sandbox Code Playgroud)

正确的做到这一点的方法是使用jq生成包含文字值安全地转义JSON:

# GOOD: Result will always be syntactically valid JSON.
account0=exampleName; passwd=examplePassword
data=$(jq -cn --arg account0 "$account0" --arg passwd "$passwd" '
  {"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}
')
echo "$data"
Run Code Online (Sandbox Code Playgroud)

还记得我说的echo是一个问题,即使这不是你眼前的问题吗?请参阅其POSIX规范的"应用程序使用"部分,以了解处理任意数据时其天生不可靠的原因,请记住,bash可以在运行时配置为根据该规范中描述的任何变体进行操作.使用printf '%s\n' "$foo"而不是echo "$foo"获得一致和可靠的行为.