Bash: 如何将数组项作为选项传递?
Bash: how to pass array items as options?
我正在尝试为基于数组的 curl 生成 headers:
HEADERS=( "content-type: text/plain" "Authorization: password" )
当我手动指定每一个时,它起作用了:
curl --header "${HEADERS[0]}" --header "${HEADERS[1]}" http://httpbin.org/headers
但是当我尝试自动生成时,curl 抱怨:
curl `for H in "${HEADERS[@]}";do echo --header $H ;done` http://httpbin.org/headers
curl: (6) Could not resolve host: text
curl: (6) Could not resolve host: password
...
我尝试了各种引号转义和求值,但都没有成功。你能建议一种让它发挥作用的方法吗?
parameters=()
for((i=0; i<${#HEADERS[@]}; i++)); do
parameters+=("--header" "${HEADERS[$i]}");
done
curl "${parameters[@]}"
另请参阅:
我喜欢 wfr 的回答,但为了避免创建中间变量,我想到了:
for H in "${HEADERS[@]}"; do [[ "$HEADERS" == "-"* ]] || HEADERS=(); HEADERS+=("-H" "$H");done
curl "${HEADERS[@]}" http://httpbin.org/headers
谢谢!
一个简单明了的解决方案,没有循环:
HEADERS=( "content-type: text/plain" "Authorization: password" )
curl "${HEADERS[@]/#/-H}" http://httpbin.org/headers
替换表达式在每个数组元素上独立执行,结果作为每个数组元素插入一个单词(与 "${HEADERS[@]}"
相同)。模式中的 #
表示“仅在开头替换。使用 -H
而不是 --header
编写命令行选项使得将选项名称添加到每个字符串变得容易得多,因为curl 接受 -Hoption_value
,而正常的命令行语法 --header=option_value
语法不被 curl 接受。(感谢 @wfr 指出 curl 不会接受 --header=...
。)
我正在尝试为基于数组的 curl 生成 headers:
HEADERS=( "content-type: text/plain" "Authorization: password" )
当我手动指定每一个时,它起作用了:
curl --header "${HEADERS[0]}" --header "${HEADERS[1]}" http://httpbin.org/headers
但是当我尝试自动生成时,curl 抱怨:
curl `for H in "${HEADERS[@]}";do echo --header $H ;done` http://httpbin.org/headers
curl: (6) Could not resolve host: text
curl: (6) Could not resolve host: password
...
我尝试了各种引号转义和求值,但都没有成功。你能建议一种让它发挥作用的方法吗?
parameters=()
for((i=0; i<${#HEADERS[@]}; i++)); do
parameters+=("--header" "${HEADERS[$i]}");
done
curl "${parameters[@]}"
另请参阅:
我喜欢 wfr 的回答,但为了避免创建中间变量,我想到了:
for H in "${HEADERS[@]}"; do [[ "$HEADERS" == "-"* ]] || HEADERS=(); HEADERS+=("-H" "$H");done
curl "${HEADERS[@]}" http://httpbin.org/headers
谢谢!
一个简单明了的解决方案,没有循环:
HEADERS=( "content-type: text/plain" "Authorization: password" )
curl "${HEADERS[@]/#/-H}" http://httpbin.org/headers
替换表达式在每个数组元素上独立执行,结果作为每个数组元素插入一个单词(与 "${HEADERS[@]}"
相同)。模式中的 #
表示“仅在开头替换。使用 -H
而不是 --header
编写命令行选项使得将选项名称添加到每个字符串变得容易得多,因为curl 接受 -Hoption_value
,而正常的命令行语法 --header=option_value
语法不被 curl 接受。(感谢 @wfr 指出 curl 不会接受 --header=...
。)