Использование переменных внутри команды curl, не работающих в скрипте Bash

top -b -n 1

Из man top:

 -b : Работа в пакетном режиме
 Запускает top в 'Пакетном режиме', который может быть полезен для 
 отправки вывода из top в другие программы или в 
 файл. В этом режиме top не будет принимать входные данные и будет работать
 до истечения лимита итераций, который вы установили с помощью опции '-n' 
 или пока не будет убит.
1
04.11.2018, 15:53
1 ответ

Ваша проблема в основном связана с флагами -Fв строке $final_paths. Он передается одним аргументом в curl. Решение: не вместо -заключает в кавычки расширение переменной, чтобы полагаться на правильное разделение строки оболочкой.

Когда у вас есть список вещей, которые вам нужно передать в программу в виде отдельных элементов, используйте массив:

#!/bin/bash

url='http://localhost:4502'
url+='/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content'

tag_paths=(
    '/content/cq:tags/sales-stage/pre-sale'
    '/content/cq:tags/sales-stage/special-offer'
)

curl_opts=( --user "admin:admin" --form "tags3@TypeHint=String[]" )

for tag_path in "${tag_paths[@]}"; do
    curl_opts+=( --form "tags2=$tag_path" )
done

curl "${curl_opts[@]}" "$url"

Здесь мы помещаем параметры для передачи curlв массив curl_opts. Мы инициируем этот массив с вещами, которые, как мы знаем, всегда будут там, а затем добавляем параметры пути тега, перебирая массив tag_paths. Расширение "${curl_opts[@]}"в двойных кавычках -в конце будет расширено на все элементы массива curl_opts, причем каждый элемент будет отдельно заключен в кавычки.

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

Делая это таким образом, цитирование становится интуитивно понятным, и вам не нужно возиться с разбором списков, разделенных запятыми -, с экранированием специальных символов или установкой IFSна какое-то не -значение по умолчанию.


Тот же скрипт, но для/bin/sh:

#!/bin/sh

url='http://localhost:4502'
url="$url/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content"

set -- \
    '/content/cq:tags/sales-stage/pre-sale' \
    '/content/cq:tags/sales-stage/special-offer'

for tag_path do
    set -- "$@" --form "tags2=$tag_path"
    shift
done

set -- --user "admin:admin" --form "tags3@TypeHint=String[]" "$@"

curl "$@" "$url"

Здесь мы ограничены использованием только одного массива, $@. Элементы устанавливаются в этом массиве с помощью set.

1
27.01.2020, 23:42

Теги

Похожие вопросы