Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shell是否回显没有转义字符的完整内容_Linux_Bash_Shell - Fatal编程技术网

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

Linux shell是否回显没有转义字符的完整内容,linux,bash,shell,Linux,Bash,Shell,我的shell脚本如下所示: #!/bin/bash account0=0xf2de2e86b9b634f655e441a4e8353c9bf59352d7 passwd=123456 data={"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]} echo $data 我的期望是(通知): 不是 : 而我不想使用转义字符,怎么办? 与内容插入xml标记“一样,echo不是

我的shell脚本如下所示:

#!/bin/bash
account0=0xf2de2e86b9b634f655e441a4e8353c9bf59352d7
passwd=123456
data={"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}
echo $data
我的期望是(通知):

不是

: 而我不想使用转义字符,怎么办?
与内容插入xml标记“
一样,
echo
不是您的问题。(这是个问题,但不是你眼前的问题)

您的问题是您的引号根本没有分配给变量。引号是bash的语法;它将它们作为如何解析字符串的说明的一部分来读取。因此,它们被bash本身使用,除非它们本身被引用或转义,否则不会被指定为值


要使整行文字化,可以将整行置于单引号中:

data='{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}'
echo "$data"
…或者您可以使用heredoc生成它,但要降低效率:

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

…或者切换到一个无引号的代码(使用
echo
不是您的问题。(这是一个问题,但不是您的直接问题)

您的问题是,您的引号根本没有分配给变量。引号是bash的语法;它将它们作为如何解析字符串的指令的一部分来读取。因此,它们被bash本身使用,除非它们本身被引用或转义,否则不会被分配为值


要使整行文字化,可以将整行置于单引号中:

data='{"jsonrpc":"2.0","method":"personal_unlockAccount","id":1,"params":[$account0,$passwd]}'
echo "$data"
…或者您可以使用heredoc生成它,但要降低效率:

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

…或切换到不带引号的heredoc(使用
“不想使用转义字符”--当涉及到引号时,您没有选择(关于如何引用,您有很多选择,但您没有选择在不进行任何引用或转义的情况下编写任意文本,除非您将其放在一个单独的文件中,而该文件未被解析为源文件——即使将某些内容放在引用的heredoc中,该heredoc的开头和结尾也构成引用边界)。在Python、C或Java中,如果没有任何类型的引号字符,您就无法编写任意字符串;为什么您希望能够以这种方式在shell中编写任意字符串?请确保这一点很清楚,顺便说一句--
echo
与您的
数据
字符串的解析方式没有任何关系。
echo$data
运行时,
data
已经分配了一个值,
echo
无法知道解析为该值或以其他方式分配该值的代码的文字行是什么。现在,如果不引用
$data
,则该值在传递给
echo
之前会被字符串拆分和全局分配,这可能会对其造成一点损坏,但是
echo“$data”
传递
echo
变量
data
的精确内容,而
echo
可能以不需要的方式影响您的价值,而遵从性实现往往会做的一组不需要的事情(在我回答末尾的链接中描述)不要包括引号删除;在调用
echo
时,引号删除已经发生或没有发生,现在更改已经太迟了。像GOLANG一样,``可以处理引号而不是转义字符……也就是说,作为一个提示,可以避免需要问额外的问题,如果您传递的内容是JSON,请使用
--argjson
,而不是
--arg
“不想使用转义字符”--在引用时,您别无选择(关于如何引用,您有很多选择,但您没有选择在不进行任何引用或转义的情况下编写任意文本,除非您将其放在一个单独的文件中,而该文件未被解析为源文件——即使将某些内容放在引用的heredoc中,该heredoc的开头和结尾也构成引用边界)。在Python、C或Java中,如果没有任何类型的引号字符,您就无法编写任意字符串;为什么您希望能够以这种方式在shell中编写任意字符串?请确保这一点很清楚,顺便说一句--
echo
与您的
数据
字符串的解析方式没有任何关系。
echo$data
运行时,
data
已经分配了一个值,
echo
无法知道解析为该值或以其他方式分配该值的代码的文字行是什么。现在,如果不引用
$data
,则该值在传递给
echo
之前会被字符串拆分和全局分配,这可能会对其造成一点损坏,但是
echo“$data”
传递
echo
变量
data
的精确内容,而
echo
可能以不需要的方式影响您的价值,而遵从性实现往往会做的一组不需要的事情(在我回答末尾的链接中描述)不要包括引号删除;在调用
echo
时,引号删除已经发生或没有发生,现在更改已经太迟了。像GOLANG一样,``可以处理引号而不是转义字符……也就是说,作为一个提示,可以避免需要问额外的问题,如果您传递的内容是JSON,请使用
--argjson
,而不是
--arg
。或者,使用带引号的herdoc和
cat
读取数据@williampersell,很好的调用。(还有,呃,你的意思是“没有”,对吧?)我采用了它来支持多行字符串。或者,使用带引号的herdoc和
cat
读取数据@williampersell,很好的调用。(还有,呃,你的意思是“没有”,对吗?),我已经采用它来支持多行字符串。
# 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"
# 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"
# 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"