Назад | Перейти на главную страницу

Bash: выполнить команду из переменной без eval

У меня проблема со сценарием, который должен выполнять curl команда, составленная из заданных аргументов. Работает, если я использую eval в подоболочке, однако, я бы хотел избежать этого, поскольку это кажется плохим стилем в соответствии с этот

Вот соответствующая часть сценария:

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

С eval я получаю 201 или 401 в зависимости от действительности данных учетных данных, как и ожидалось. Если я удалю eval и использую echo $($COMMAND) Я получаю 400, что указывает на неверно построенный параметр данных.

Может ли кто-нибудь объяснить мне, как мне создать команду, чтобы я мог напрямую передать ее подоболочке?

Вы можете использовать обратные кавычки или вложение, чтобы избежать использования eval.

Обратные кавычки

$ 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\"}'"\`

Гнездование

$ 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\"}'")

Вложенность поддерживается в подавляющем большинстве оболочек и более удобочитаема, чем обратные кавычки.

Спасибо, Пьер.

После еще нескольких попыток проб и ошибок о том, где разместить какие цитаты, я наконец получил эту работу:

$(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\""}")