Passar parâmetro para comando entre aspas simples

0

Estou tentando executar um script:

#!/bin/sh 
A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"Test_Asset","open":true}' 100 echo "$A" 
exit 

Estou tentando passar Test_Asset como parâmetro:

#!/bin/sh 
B=$1 A=multichain-cli chain97 issue 1XRnkvTc1Ev3q8UnSyynu1Qb9ss1E3aJWZn2bQ '{"name":"$B","open":true}' 100 echo "$A" 
exit

O recurso é criado com o nome como $ B. Eu quero que o ativo seja criado com o valor de B, não $ B literalmente.

    
por user1917578 31.07.2017 / 12:42

3 respostas

3

Dentro de aspas simples, nada é expandido. Então você precisa sair das citações simples. Em qualquer caso, você gostaria de citar duas vezes suas expansões de variáveis, a menos que queira que split + glob se aplique a elas, então:

A=$(multichain-cli issue '{"name":'"$ASSET"',"open":true}' "$D")
#                         ''''''''  """"""  '''''''''''''
printf '%s\n' "$A"

(o '''' , """"" para mostrar quais partes estão com aspas simples, que são aspas duplas).

O mais provável é que você queira que o conteúdo de $ASSET esteja entre aspas duplas no código JSON, portanto, é necessário incluí-los (no literal, que está na parte de citações simples):

A=$(multichain-cli issue '{"name":"'"$ASSET"'","open":true}' "$D")
#                         '''''''''  """"""  ''''''''''''''

Não confunda as aspas duplas que são usadas para citar shell (aqui para evitar split + glob na expansão de $ASSET ) e as aspas duplas que são passadas textualmente para multichain-cli .

Pode ser necessário considerar os casos em que $ASSET contém aspas duplas em si ou outros caracteres (como barra invertida, nova linha ou outros caracteres de controle) que são especiais na sintaxe JSON. Para caracteres não-ASCII, você também precisará verificar se eles estão codificados da maneira esperada por multichain-cli .

Como alternativa, você pode usar aspas duplas para todas as coisas, como @Bex mostrou , embora isso signifique que você precisa escapar do " s ( mas também $ , \ e ' ) com barra invertida no texto passado para multichain-cli (e evite usar a antiga sintaxe '...' para substituição de comando, pois ele faz processamento adicional com contrabarra).

    
por 31.07.2017 / 13:03
2

Tente

ASSET="$1"
D="$2"
A="$(multichain-cli issue "{\"name\":$ASSET,\"open\":true}" "$D")"
echo "$A"
exit

A substituição de variáveis não deve acontecer dentro de literal citações (que é o single '). Use aspas duplas e escape uma aspa dupla desejada na saída com uma barra invertida \ .

    
por 31.07.2017 / 12:51
-3

Obrigado pela resposta pessoal. Como solução, estou escrevendo o comando em um arquivo e, em seguida, executando esse arquivo. Isso funciona como abaixo:

#!/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
    
por 31.07.2017 / 14:15