bash:变量外部函数范围

DSD*_*SD 6 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
}
Run Code Online (Sandbox Code Playgroud)

然后在函数外使用它:

 echo $global_var
Run Code Online (Sandbox Code Playgroud)

结果

   $0: line 16: =<bla bla>: command not found
Run Code Online (Sandbox Code Playgroud)

我尝试使用declare:

declare -r global_var
Run Code Online (Sandbox Code Playgroud)

相同的结果

tha*_*guy 7

是的,你可以,但你必须小心以不正常的方式限制范围的子壳.while read像你正在做的循环管道是一个常见的陷阱.

而不是管道到一个读取循环,使用重定向和进程替换:

_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"
Run Code Online (Sandbox Code Playgroud)

您还需要确保您的作业在语法上有效.$var = value不是有效的bash赋值,var=value而是.shellcheck可以指出很多类似的东西.