最近,我决定读多一点关于bash的内置插件declare
,local
和readonly
,这使我从切换:
local variable_name
variable_name='value'
readonly variable_name
Run Code Online (Sandbox Code Playgroud)
到:
variable_name='value'
declare -r variable_name
Run Code Online (Sandbox Code Playgroud)
此更改减少了写入的行数并允许我设置一些属性,例如告诉 bash 变量的值是一个整数,这很好。然而,在创建一个用作 cURL 别名的函数时,我注意到如果我使用declare
,数组中的变量永远不会扩展,但使用local
和扩展就好了readonly
。
下面是一个例子:
#!/usr/bin/env bash
set -o errexit -o errtrace -o pipefail -o nounset
IFS=$'\n\t'
curl() {
curl_version="$(command curl --version | awk 'NR==1 {print $2}')"
declare -r curl_version
curl_args=(
--user-agent "curl/${curl_version}"
--silent
--fail
)
command curl "${curl_args[@]}" \
"${@}"
}
curl --url 'https://httpbin.org/get'
Run Code Online (Sandbox Code Playgroud)
因为无论出于何种原因变量都不会扩展,--user-agent
数组的一部分使脚本退出并出现错误,因为据 bash 所知,这是一个未绑定的变量,并且由于set -o nounset
.
几天来我一直试图让它发挥作用,所以我想是时候扔掉毛巾寻求帮助了。任何人都可以指出我正确的方向以了解我做错了什么吗?
编辑: …