Bash: executa o comando da variável sem eval

2

Eu tenho um problema com um script que deve executar um comando curl composto dos argumentos dados. Ele funciona se eu usar eval no subshell, no entanto, eu gostaria de evitar que, como parece ser um estilo ruim de acordo com this

Aqui está a parte relevante do script:

#!/bin/bash
COMMAND="curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"
echo $(eval $COMMAND)

Com o eval, recebo 201 ou 401, dependendo da validade das credenciais fornecidas, conforme o esperado. Se eu remover eval e usar echo $($COMMAND) , recebo 400, o que indica um parâmetro de dados construído incorretamente.

Alguém pode me explicar, como eu tenho que construir o comando de forma que eu possa passá-lo diretamente para um subshell?

    
por Jonas 16.09.2014 / 11:50

2 respostas

3

Você pode usar backticks ou aninhamento para evitar o uso de eval.

Backticks

$ var=\'curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'"\'

Aninhamento

$ var = $(curl -s -o /dev/null -w '%{http_code}' -X POST -H \"Content-Type:application/json\" -H \"Accept:application/json\" https://www.example.com/login -d '{\"username\":\"$1\",\"password\":\"$2\"}'")

O aninhamento é suportado na grande maioria dos shells e mais legível que os backticks.

    
por 16.09.2014 / 12:17
0

Obrigado Pierre.

Depois de mais algumas tentativas de tentativa e erro sobre onde colocar que tipo de citações eu finalmente consegui trabalhar:

$(curl -s -o /dev/null -w '%{http_code}' -X POST -H "Content-Type:application/json" -H "Accept:application/json" https://example.com/login -d "{\"username\":"\"$1\"",\"password\":"\"$2\""}")
    
por 16.09.2014 / 14:23