我正在尝试有条件地向 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')