&$
являются специальными символами оболочки.&
помещает предыдущую команду в фоновом режиме.$filter
оценивает переменную с именем filter, которая, очевидно, пуста.Итак, вы остались со второй командой =eventTimestamp
с некоторыми параметрами, и bash жалуется.Обычно указывайте ваш URL в ''
.Но это становится сложнее, потому что у вас есть одинарные кавычки в URL.Если вы введете это значение, вам нужно закрыть кавычку перед любым литералом '
и использовать \'
для каждого '
, а затем снова открыть кавычку.
curl -X GET 'https://management.azure.com/subscriptions/xxxxxxxxxxxxxxxxxxxx/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&$filter=eventTimestamp ge '\''2019-03-18T20:00:00Z'\'' and eventTimestamp le '\''2019-03-23T20:00:00Z'\'' and resourceGroupName eq '\''xxxx'\''
Вы можете обойти эту проблему, набрав urlsнапример, в файле читайте его содержимое в переменную оболочки следующим образом:
url=$(cat url_file)
или в форме документа здесь:
url=$(cat <<'EOF'
https://management.azure.com/subscriptions/xxxxxxxxxxxxxxxxxxxx/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&$filter=eventTimestamp ge '2019-03-18T20:00:00Z' and eventTimestamp le '2019-03-23T20:00:00Z' and resourceGroupName eq 'xxxx'
EOF
)
, а затем выполните:
curl -X GET "$url"
Также будут работать специальные символы Url-кодирования.
Если вам это нужно, вы можете использовать эту функцию оболочки для цитирования строк, содержащих одинарные кавычки:
quotifySingle() {
#does the same as
#printf %s\\n "$(printf %s "$1" | sed "s/'/'\\\\''/g")"
local input="$1"
local tmp=''
while [ ${#input} -gt 0 ]
do
tmp=${input#?}
case ${input} in
\'*) printf \'\\\'\' ;;
*) printf %s "${input%"${tmp}"}" ;;
esac
input=${tmp}
done
}