通过函数传递的Bash变量
我已经看过了其他几个可变的帖子,但似乎仍然坚持我试图尝试的内容 我有一个现有的脚本,它有一系列类似的块通过函数传递的Bash变量,bash,shell,Bash,Shell,我已经看过了其他几个可变的帖子,但似乎仍然坚持我试图尝试的内容 我有一个现有的脚本,它有一系列类似的块 set_name="something" # Required values var1=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "key1_${set_name}") if [[ -z "$var1" ]]; then echo "Cannot find required var1" exit 1 fi var2=$
set_name="something"
# Required values
var1=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "key1_${set_name}")
if [[ -z "$var1" ]]; then
echo "Cannot find required var1"
exit 1
fi
var2=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "key2_${set_name}")
if [[ -z "$var2" ]]; then
echo "Cannot find required var2"
exit 1
fi
# Optional, okay to be empty
var3=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "key3_${set_name}")
var4=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "key4_${set_name}")
我试图考虑一些样板检查,以使这组查找任务更容易阅读(无论如何,在我看来)。我尝试的上一次迭代(显然不起作用)看起来像
ZTest () {
var=$1
if [[ -z "${!var}" ]]; then
echo $2
exit 1
fi
}
VarRequire () {
var=$1
key=$2
errmsg=$3
VarLookup ${!var} $key
ZTest ${!var} $errmsg
}
VarLookup () {
var=$1
key=$2
${!var}=$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "$key")
}
# Required
VarRequire "var1" "key1_${set_name}" "Cannot find required var1"
VarRequire "var2" "key2_${set_name}" "Cannot find required var2"
# optional
VarLookup "var3" "key3_${set_name}"
VarLookup "var4" "key4_${set_name}"
最终的结果是,我将能够在脚本中引用$var1、$var2、$var3、$var4,与原始脚本一样
我在bash中尝试的是可能的吗?Var*函数中的间接性太多了
VarRequire () {
local var=$1
local key=$2
local errmsg=$3
VarLookup "$var" "$key"
ZTest "$var" "$errmsg"
}
VarLookup () {
local var=$1
local key=$2
declare -g "$var"="$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "$key")"
}
declare
命令允许您使用变量的值作为变量名。我使用-g
选项,因此变量是全局变量
ZTest函数确实需要间接寻址。Var*函数中的间接寻址太多
VarRequire () {
local var=$1
local key=$2
local errmsg=$3
VarLookup "$var" "$key"
ZTest "$var" "$errmsg"
}
VarLookup () {
local var=$1
local key=$2
declare -g "$var"="$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "$key")"
}
declare
命令允许您使用变量的值作为变量名。我使用-g
选项,因此变量是全局变量
ZTest函数确实需要间接寻址。来自BASH手册页
所以答案是肯定的。如果在函数中声明一个变量alocal
,并且它调用另一个函数,那么该函数也可以访问该变量。来自BASH手册页
所以答案是肯定的。如果在函数中声明一个变量a
local
,并且它调用另一个函数,则该函数也可以访问该变量。ZTest
已作为参数扩展运算符提供:
: ${var1:?Cannot find required var1}
不过,您与VarLookup
关系密切;您需要使用declare
命令来创建变量${!var}
仅用于在变量存在时访问该值。(请注意,declare
需要使用-g
选项来避免创建局部变量,该选项仅在版本4.2中引入。)
在版本4.2之前,您可以使用printf
代替declare
:
printf -v "$var" '%s' "$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "$key")"
我会抵制在shell中进行太多重构的冲动,因为间接过程可能很脆弱。我建议更直接一些,比如
var_lookup () {
REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "${1}_$set_name"
}
var1=$(var_lookup key1); : ${var1:?Cannot find required var1}
var2=$(var_lookup key2); : ${var2:?Cannot find required var2}
var3=$(var_lookup key3)
var4=$(var_lookup key4)
ZTest
已作为参数扩展运算符提供:
: ${var1:?Cannot find required var1}
不过,您与VarLookup
关系密切;您需要使用declare
命令来创建变量${!var}
仅用于在变量存在时访问该值。(请注意,declare
需要使用-g
选项来避免创建局部变量,该选项仅在版本4.2中引入。)
在版本4.2之前,您可以使用printf
代替declare
:
printf -v "$var" '%s' "$(REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "$key")"
我会抵制在shell中进行太多重构的冲动,因为间接过程可能很脆弱。我建议更直接一些,比如
var_lookup () {
REQUIRED_ENV_VAR=/path/to/somewhere mybinary -p "${1}_$set_name"
}
var1=$(var_lookup key1); : ${var1:?Cannot find required var1}
var2=$(var_lookup key2); : ${var2:?Cannot find required var2}
var3=$(var_lookup key3)
var4=$(var_lookup key4)
您能否在开始时设置一次
REQUIRED\u ENV\u VAR=/path/to/where
?
当发现变量时,mybinary是否返回0
你可能喜欢这样的东西
function mylog {
errortype=$1
shift
echo "(maybe show ${errortype}) $*"
if [ "$errortype" = "error" ]; then
exit 1
fi
}
var1=$(mybinary -p "key1_${set_name}") || mylog error "Cannot find required var1"
var2=$(mybinary -p "key2_${set_name}") || mylog error "Cannot find required var2"
var3=$(mybinary -p "key3_${set_name}")
var4=$(mybinary -p "key4_${set_name}") || mylog debug "Just want to say something"
您能否在开始时设置一次
REQUIRED\u ENV\u VAR=/path/to/where
?
当发现变量时,mybinary是否返回0
你可能喜欢这样的东西
function mylog {
errortype=$1
shift
echo "(maybe show ${errortype}) $*"
if [ "$errortype" = "error" ]; then
exit 1
fi
}
var1=$(mybinary -p "key1_${set_name}") || mylog error "Cannot find required var1"
var2=$(mybinary -p "key2_${set_name}") || mylog error "Cannot find required var2"
var3=$(mybinary -p "key3_${set_name}")
var4=$(mybinary -p "key4_${set_name}") || mylog debug "Just want to say something"
您可以使用
local
限定符来限制函数变量的范围。您可以使用local
限定符来限制函数变量的范围。在函数中,declare
=local
,need-g
我无法让你的printf版本工作,原因是什么,但最后一个选项似乎对我来说足够好在一个函数中,declare
=local
,need-g
我无法让你的printf版本工作,原因是什么,但最后一个选项对我来说足够好