curl с переменной не работает — сценарий оболочки

#shell #curl #sh

#оболочка #curl #sh

Вопрос:

когда я выполняю обычный curl с помощью скрипта оболочки, функция не работает.

Эта работа:

 curl -s -v -X POST --data '{
    "zoneConfig": {
        "userID": "'$userid'",
        "name": "'$myName'",
        "id":"'$id'"
    },
    "delete": [
        {
            "id": "ID1"
        },
        {
            "id": "ID2"
        }
    ]
}' https://urlToAPI
  

Но как только я помещаю «удалить» в переменную, я получаю неопределенную ошибку от поставщика API

Это не работает

 delete='{
    "id": "ID1"
},
{
    "id": "ID2"
}'

curl -s -v -X POST --data '{
    "zoneConfig": {
        "userID": "'$userid'",
        "name": "'$myName'",
        "id":"'$id'"
    },
    "delete": [
        '$deleteValues'
    ]
}' https://urlToAPI
  

Но я не понимаю разницы, поскольку обе конфигурации одинаковы?

Комментарии:

1. добавьте -trace-ascii dump.txt в командную строку и проверьте этот файл после выполнения вашей команды…

2. Я получаю «== Info: не удалось разрешить хост: «200905shwpkzwvw4coy»»

3. … который намекает на то, что вы каким-то образом получили аргумент --data неправильно (проблемы с кавычками?) таким образом, curl интерпретировал эту последовательность как URL-адрес вместо содержимого публикации.

4. и, пожалуйста, отбросьте -X POST это заставляет мою голову болеть.

5. @Daniel Stenberg Спасибо. Но что лучше? Когда я ищу в stackoverflow, я нахожу много примеров с этим

Ответ №1:

При интерполяции значение разбивается на пробелы.[1]

Как таковой,

 a='a b c'
prog $a
  

эквивалентно

 prog 'a' 'b' 'c'
  

Это разделение не происходит, если интерполяция происходит внутри двойных кавычек.

Как таковой,

 a='a b c'
prog "$a"
  

эквивалентно

 prog 'a b c'
  

Следовательно, вам необходимо изменить

 $deleteValues
  

Для

 "$deleteValues"
  

  1. Чтобы быть точным, IFS переменная env управляет разделением значения. Обычно он устанавливается таким образом, что разделение происходит по пробелам, табуляциям и переводам строк.