(可选)在 curl 请求中包含用户和密码?

Optionally include a user and password in curl request?

我可以选择在 curl 请求中包含用户和密码,如下所示:

declare creds=""
if [ -n "$user" ] && [ -n "$password" ]; then
    creds="-u ${user}:${password}"
fi

output=$(curl ${creds} -X PUT -v --write-out "%{http_code}" "$url" \
                  -H 'Content-Type: application/json' -s -o /dev/null --data "${payload}")

这似乎工作正常,但我收到了这个 shellcheck 警告:

Double quote to prevent globbing and word splitting

https://github.com/koalaman/shellcheck/wiki/SC2086

用引号引起来是行不通的,例如如果我这样做:

output=$(curl "${creds}" -X PUT -v --write-out "%{http_code}" "$url" \
                  -H 'Content-Type: application/json' -s -o /dev/null --data "${payload}")

然后当未提供用户名和密码时,这会导致 curl 请求中出现空双引号 curl "" -X PUT ...,从而产生 <url> malformed 错误。

我可以对 curl 命令使用 if-else,但我宁愿避免重复。尽管有 shellcheck 警告,上述方法是否可以接受?

您在变量周围加上引号是正确的,但是 shellcheck 没有抓住将命令存储在有其自身缺陷的变量中的问题。由于这是 shell 功能的一个问题,shellcheck 无法立即捕捉到它。当你在下面做的时候

creds="-u ${user}:${password}"

并引用 "$creds",它作为一个单独的参数字传递给 curl,而不是分别分解为 -u"${user}:${password}"。正确的方法应该是使用一个数组来存储命令并扩展它,这样单词就会被保留而不被 shell 分割(引用变量的首要原因,如 shellcheck 所示) )

creds=(-u "${user}:${password}")

并调用

curl "${creds[@]}" <rest-of-the-cmd>

同时探索以下内容

  1. I'm trying to put a command in a variable, but the complex cases always fail!
  2. How to store a command in a variable in a shell script?