У меня проблема со сценарием, который должен выполнять 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\""}")