是否有可能在bash中初始化全局变量并在函数中为其赋值,然后在函数范围外使用它?
功能示例:
globla_var=""
_DBINFO()
{
curl -su $AUTH https://<balla bla >/databases | jq -c 'map(select(.plan.name != "Sandbox")) | .[] | {id, name}'| \
while read db
do
idb=$(echo "$db" | jq -r '.id')
name=$(echo "$db" | jq -r '.name')
if [[ $name = '<bla>' ]]; then
$global_var_her = $(<bla value>)
fi
done
}
然后在函数外使用它:
echo $global_var
结果
$0: line 16: =<bla bla>: command not found
我尝试使用declare:
declare -r global_var
相同的结果
答案 0 :(得分:6)
是的,你可以,但你必须小心以不正常的方式限制范围的子shell。如您正在is a common pitfall进行while read
循环管道。
使用重定向和进程替换,而不是使用while循环读取循环:
_DBINFO()
{
while read db
do
idb=$(echo "$db" | jq -r '.id')
name=$(echo "$db" | jq -r '.name')
if [[ $name = '<bla>' ]]; then
global_var=value
fi
done < <(curl -su "$AUTH" "https://$host/databases" |
jq -c 'map(select(.plan.name != "Sandbox")) | .[] | {id, name}')
}
AUTH="user:password"
host="example.com"
_DBINFO
echo "The global variable is $global_var"
您还需要确保您的作业在语法上有效。 $var = value
不是有效的bash分配,而var=value
是。{1}}。 shellcheck可以指出很多类似的东西。
答案 1 :(得分:4)
也许您将bash
与php
混为一谈。只需删除$
,_her
部分和空格:
global_var=$(<bla value>) # or maybe: global_var='<bla value>'
而不是:
$global_var_her = $(<bla value>)
有了这个,错误消失了。
另一方面,请检查that other guy answer对管道的看法。
是的,可以定义一个全局变量,并按照你的方式完成。
也许有用的指点:
$(<bla value>)
如果<bla value>
是一个命令,那么句子就可以了,因为这是用Command Substitution
捕获命令输出的方法。
相反,如果是字面值,只需删除$()
,只留下'<bla value>'
(global_var='<bla value>'
)。这与$(echo '<bla value>')
相同,但这会浪费不必要的资源。
答案 2 :(得分:1)
除非在某个函数中声明为local,否则所有变量都具有全局范围。
因此,程序中的所有变量在函数外部都有效 但是有几个问题:
vagrant up --debug
发送curl ...
的输出。这创建了一个子shell。在子shell中更改的变量不会转换为全局变量。|
。那是一个错字吗?它应该是globla_var=""
吗?global_var
之前和之后有一个空格。这是bash中的错误语法,一般是在shell中。$global_var_her = "bla"
。这不会分配给变量$
。global_var_her
似乎是UN需要的。所有更正,这应该有效:
_her
答案 3 :(得分:1)
已经回答了,但是我给它一个简短的解决方法
test() { declare x="Important output"; }
test && echo $x
虽然我们没有解决办法,但不会提供任何输出,这是我建议使用的方法
test() { export x="Important output"; }
test && echo $x
将给我们输出