尝试将变量作为 URL 的一部分传递时,出现 CURL 错误“使用错误/非法格式的 URL 或缺少 URL”

loc*_*cal 15 bash curl jq

当我尝试执行下面的脚本并收到错误时:“curl: (3) URL using bad/illegal format or missing URL”

#!/bin/bash

stage="develop"
branch="branch_name"

getDefinition=$(curl -u user@example.com:password -X GET "https://dev.azure.com/organization/project/_apis/build/definitions?api-version=5.1")

for def in $(echo "$getDefinition" | jq '.value[] | select (.path=="\\Some_path\\'$stage'") | .id'); do
  getBuildInfo=$(curl -u user@example.com:password -X GET "https://dev.azure.com/organization/project/_apis/build/definitions/${def}\?api-version=5.1")
        # echo $def
        body=$(echo "${getBuildInfo}" | jq '.repository.defaultBranch = "refs/heads/release/'"${branch}"'"' | jq '.options[].inputs.branchFilters = "[\"+refs/heads/release/'"${branch}"'\"]"' | jq '.triggers[].branchFilters[] = "+refs/heads/release/'"${branch}"'"')
        echo ${body} > data.json    
done
Run Code Online (Sandbox Code Playgroud)

当我尝试将变量${def}传递到一行时会发生这种情况:

curl -u user@example.com:password -X GET "https://dev.azure.com/organization/project/_apis/build/definitions/${def}\?api-version=5.1"
Run Code Online (Sandbox Code Playgroud)

但是当我声明一个数组时,curl 按预期工作。例子:

declare -a def
def=(1 2 3 4)

curl -u user@example.com:password -X GET "https://dev.azure.com/organization/project/_apis/build/definitions/${def}\?api-version=5.1"
Run Code Online (Sandbox Code Playgroud)

您能否建议我如何正确地将变量传递给 URL?

der*_*ekm 5

设置IFS=$' \t\r\n'在脚本的顶部。

IFS是交互式字段分隔符。

在 UNIX 中,IFS是空格、制表符、换行符或$' \t\n',但在 Windows 上必须是$' \t\r\n'

^M 字符是\r


小智 1

需要调用curl 4次吗?如果是这样。

for def in 1 2 3 4; do curl -u user@example.com:password -X GET "https://dev.azure.com/organization/project/_apis/build/definitions/${def}\?api-version=5.1"; done
Run Code Online (Sandbox Code Playgroud)

  • 问题已经解决了。变量包含 ^M 字符。删除此 CURL 后工作正常。 (12认同)