Ваша проблема в основном связана с флагами -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
.
Выходные данные ip addr
и ifconfig
эквивалентны, но немного различаются обозначениями одного и того же IP-адреса и сетевой маски.
Понятие
10.0.1.178/24
означает, что ваш IP-адрес 10.0.1.178
, а сетевая маска для вашей сети состоит из первых 24 бит адреса. Это то же самое, что утверждение
inet 10.0.1.178 netmask 255.255.255.0
из вывода ifconfig
, только в более компактной записи, и означает, что с точки зрения таблицы маршрутизации ядра ваш IP-адрес считается принадлежащим подсети, в которой может размещаться до 254 различных компьютеров, чьи адреса могут варьироваться от 10.0.1.1
до 10.0.1.254
.
Информация о сетевой маске важна для ядра при попытке определить, возможно ли получить доступ к заданному удаленному адресу, с которым вы хотите установить соединение. Адрес, такой как 10.0.1.25
, например. доступен сразу, так как принадлежит к той же подсети, что и ваш собственный компьютер, но для достижения, скажем, 10.0.2.105
должен быть настроен соответствующий маршрут.
Вы можете просмотреть эту статью в Википедии или эту статью о маршрутизации для дальнейшего чтения.
Вторая часть после косой черты — это маска вашей подсети --, другими словами, доступное количество адресов в вашей частной сети. В вашем случае это 256. Посмотрите эту шпаргалку по подсети:https://www.aelius.com/njh/subnet_sheet.html
ip (8 )— собственная утилита управления сетью Linux, принадлежащая проекту iproute2. Его можно использовать для взаимодействия с сокетом NETLINK ядра для управления сетевыми вещами Linux.
ifconfig (8 )— BSD-совместимая утилита для управления сетью, это просто оболочка iproute2.
Короче :ifconfig (8 )— это подмножество if ip (8 ), мы сохраняем его для совместимости.
СОВЕТ :Используйте ip (8 )вместо ifconfig (8 ), если это возможно.