bash:变量外部函数范围

时间:2015-10-27 19:31:08

标签: bash

是否有可能在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

相同的结果

4 个答案:

答案 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)

也许您将bashphp混为一谈。只需删除$_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,否则所有变量都具有全局范围。

因此,程序中的所有变量在函数外部都有效 但是有几个问题:

  1. 您正在使用管道vagrant up --debug发送curl ...的输出。这创建了一个子shell。在子shell中更改的变量不会转换为全局变量。
  2. var的名称是|。那是一个错字吗?它应该是globla_var=""吗?
  3. = in:global_var之前和之后有一个空格。这是bash中的错误语法,一般是在shell中。
  4. 在平等的左侧有一个$global_var_her = "bla"。这不会分配给变量$
  5. 还有一个额外的global_var_her似乎是UN需要的。
  6. 所有更正,这应该有效:

    _her

答案 3 :(得分:1)

已经回答了,但是我给它一个简短的解决方法

test() { declare x="Important output"; }

test && echo $x

虽然我们没有解决办法,但不会提供任何输出,这是我建议使用的方法

test() { export x="Important output"; }

test && echo $x

将给我们输出