我正在尝试运行一个脚本:
#!/bin/sh
A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"Test_Asset","open":true}' 100 echo "$A"
exit
我试图将 Test_Asset 作为参数传递:
#!/bin/sh
B=$1 A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"$B","open":true}' 100 echo "$A"
exit
创建资产时名称为 $B。我希望资产是用 B 的值创建的,而不是字面上的 $B。
答案1
在单引号内,没有任何内容被扩展。所以你需要摆脱单引号。无论如何,你想要双引号你的变量扩展,除非你希望 split+glob 应用于它们,所以:
A=$(multichain-cli issue '{"name":'"$ASSET"',"open":true}' "$D")
# '''''''' """""" '''''''''''''
printf '%s\n' "$A"
(''''
,"""""
显示哪些部分是单引号的,哪些部分是双引号的)。
最有可能的是,您希望$ASSET
JSON 代码中的内容位于双引号内,因此您需要包含它们(在文字中,即在单引号部分内):
A=$(multichain-cli issue '{"name":"'"$ASSET"'","open":true}' "$D")
# ''''''''' """""" ''''''''''''''
不要混淆用于 shell 引用的双引号(此处是为了防止在扩展 时出现 split+glob $ASSET
)和逐字传递给 的双引号multichain-cli
。
$ASSET
您可能需要考虑包含双引号本身或 JSON 语法中特殊的其他字符(如反斜杠、换行符或其他控制字符)的情况。对于非 ASCII 字符,您还需要确保它们以multichain-cli
.
或者,您可以对所有内容使用双引号 shell 引用,例如@Bex 表明,尽管这意味着您需要在传递给的文本中使用反斜杠转义"
s (还需要$
,\
和) (并避免使用古老的语法进行命令替换,因为它使用反斜杠进行额外处理)。`
multichain-cli
`...`
答案2
尝试
ASSET="$1"
D="$2"
A="$(multichain-cli issue "{\"name\":$ASSET,\"open\":true}" "$D")"
echo "$A"
exit
变量替换不应该发生在文字引号(即单个 ')。使用双引号,并使用反斜杠转义输出中所需的双引号\
。
答案3
感谢各位的回复。作为解决方案,我将命令写入文件,然后执行该文件。其工作原理如下:
#!/bin/sh
ASSET=$1
X=`echo "'{\"name\":\"$ASSET\",\"open\":true}'"`
A="multichain-cli chain97 issue $X 100"
echo "$A" >test.sh
B=`sh test.sh`
echo "$B"
exit