将参数传递给单引号命令

将参数传递给单引号命令

我正在尝试运行一个脚本:

#!/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"

'''',"""""显示哪些部分是单引号的,哪些部分是双引号的)。

最有可能的是,您希望$ASSETJSON 代码中的内容位于双引号内,因此您需要包含它们(在文字中,即在单引号部分内):

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

相关内容