Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过函数传递的Bash变量_Bash_Shell - Fatal编程技术网

通过函数传递的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手册页

所以答案是肯定的。如果在函数中声明一个变量a
local
,并且它调用另一个函数,那么该函数也可以访问该变量。

来自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版本工作,原因是什么,但最后一个选项对我来说足够好