如何有条件地向 curl 添加标志?

如何有条件地向 curl 添加标志?

我正在尝试有条件地向 curl 命令添加标题。

这是我的初步尝试:

# Set Auth Header
if [ $IS_PUBLIC == 0 ]; then
  AUTH_HEADER="-H 'authorization: Bearer $TOKEN'"
fi

# Get Version
VERSION=$(curl -s $AUTH_HEADER "https://api.github.com/repos/$REPOSITORY/releases/latest" | jq -r '.tag_name')

echo $VERSION输出:null,表示$AUTH_HEADER未成功插入。

接下来我根据这个问题的答案尝试了两种解决方案如何有条件地向 shell 脚本添加标志?

args=(
  -s
  "https://api.github.com/repos/$REPOSITORY/releases/latest"
)

# Set Auth Header
if [ $IS_PUBLIC == 0 ]; then
  args+=("-H 'authorization: Bearer $TOKEN'")
fi

# Get Version
VERSION=$(curl "${args[@]}" | jq -r '.tag_name')

echo $VERSION输出:空字符串。curl "${args[@]}"单独调用也会输出空字符串。

# Set Auth Header
AUTH_HEADER="-H 'authorization: Bearer $TOKEN'"

# Get Version
VERSION=$(curl -s ${IS_PUBLIC:+"$AUTH_HEADER"} "https://api.github.com/repos/$REPOSITORY/releases/latest" | jq -r '.tag_name')

其结果与第二个示例的输出相同。

令我惊讶的是,我无法让它工作,因为我得到这些解决方案的答案有很多赞成票。

答案1

经过一些小小的改动,第三种解决方案就可以奏效:

# Set Auth Header
AUTH_HEADER="authorization: Bearer $TOKEN"

# Get Version
VERSION=$(curl -s ${IS_PUBLIC:+ -H "$AUTH_HEADER"} "https://api.github.com/repos/$REPOSITORY/releases/latest" | jq -r '.tag_name')

在这里找到了决定性的线索:Bash:可选择将参数传递给命令

答案2

如果你在构建数组时使用正确的引号,第二个应该可以工作。你需要每个命令参数一个数组元素,并且在值中嵌入引号。基本上,在构建数组时,引用的方式与直接在命令行中引用的方式相同。

args=(
  -s
  "https://api.github.com/repos/$REPOSITORY/releases/latest"
)

# Set Auth Header
if [ $IS_PUBLIC == 0 ]; then
  args+=(-H "authorization: Bearer $TOKEN")    # Corrected quoting here
fi

# Get Version
VERSION=$(curl "${args[@]}" | jq -r '.tag_name')

相关内容