bash citações de escape

1

Eu tenho um desafio interessante sobre como escapar de citações em um script bash.

Meu script bash tem uma longa chamada curl com uma grande estrutura d-json passada.

#!/bin/bash

Value4Variable=Value4

curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d  \
'{"Variable1":"Value1", 
"Variable2":"Value2\'s",  # escape of quote doesnt work because of the previous single quote and backslash
"Variable3":"Value3",
"Variable4":"'"$Value4Variable"'", 
"Variable5":"Value5"
}' \
https://www.hashemian.com/tools/form-post-tester.php

Qual é a melhor maneira de adicionar uma única citação na estrutura do json? Eu tentei várias combinações, mas sem sucesso.

    
por Bernie Lenz 03.01.2018 / 19:23

2 respostas

2

Existem várias maneiras de escapar de strings longas com aspas diferentes. O mais simples é terminar a aspa simples e escapar da aspa simples:

'...'\''...'

Mas há algumas coisas mais legais que você pode fazer. Heredocs são uma boa maneira de evitar o problema de citação:

curl -s -X POST https://www.hashemian.com/tools/form-post-tester.php \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d  @- <<EOF
{
    "Variable1":"Value1", 
    "Variable2":"Value2's",
    "Variable3":"Value3",
    "Variable4":"$Value4Variable", 
    "Variable5":"Value5"
}
EOF

@- informa ao curl para ler a partir de stdin e <<EOF inicia o heredoc que será alimentado no stdin de curl. A coisa legal com o heredoc é que você não precisa escapar de nenhuma aspas e pode usar variáveis bash dentro delas evitando a necessidade de se preocupar em como escapar das aspas e tornar a coisa toda muito mais legível.

    
por 03.01.2018 / 19:45
1

Eu usaria a notação --data @filename para ler os dados do arquivo:

Amostra json-data-file contents:

{"Variable1":"Value1", 
"Variable2":"Value2's",
"Variable3":"Value3",
"Variable4":"'$Value4Variable'", 
"Variable5":"Value5"
}

O pedido:

Value4Variable="Value4"
curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" \
-d @<(sed "s/\$Value4Variable/$Value4Variable/" json-data-file) \
https://www.hashemian.com/tools/form-post-tester.php/test123

A saída:

The POSTed value is:

********************

{"Variable1":"Value1", "Variable2":"Value2's","Variable3":"Value3","Variable4":"'Value4'", "Variable5":"Value5"}

********************

Results saved to: test123
*Note: Results are purged periodically. 1 hr minimum life.
    
por 03.01.2018 / 19:45