2015-10-27 2 views
3

Есть ли способ инициализировать глобальную переменную в 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 -r global_var 

же результаты

+2

На самом деле, переменные в функции являются глобальными по умолчанию; локальные переменные должны быть явно объявлены с использованием 'local' или' declare' builtins. – chepner

ответ

5

Да, вы можете, но вы должны быть осторожны относительно подоболочек, которые ограничивают область применения неожиданными способами. Трубопровод к петле while read как вы делаете is a common pitfall.

Вместо труб в то время чтения цикла, использование перенаправления и процесс замены:

_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 есть. shellcheck может указать на многие подобные вещи.

4

Может быть, ты путаешь bash с php. Просто удалите $, то _her часть, и пространство:

global_var=$(<bla value>) # or maybe: global_var='<bla value>' 

вместо:

$global_var_her = $(<bla value>) 

С, что ошибка уходит.


С другой стороны, проверить that other guy «s answer внимание трубопроводов.

И да, можно определить глобальную переменную, и это делается так, как вы это делаете.


Может быть полезно указывать что-то об этом:

$(<bla value>) 

<bla value> Если это команда, приговор в порядке, потому что that't пути захватить вывод команды с Command Substitution.

Если вместо этого есть буквальное значение, просто удалите $(), оставив только '<bla value>' (global_var='<bla value>'). То же самое делать $(echo '<bla value>'), но это будет ненужной тратой ресурсов.

1

Все переменные имеют глобальный охват, если только не объявлены локальными внутри некоторой функции.

Итак, все вары в вашей программе действительны вне функции.
Но есть несколько проблем:

  1. Вы отправляете выход curl ... с трубой |. Это создает суб-оболочку. Переменные, измененные внутри под-оболочки, не переводятся в глобальные.
  2. Название var было globla_var="". Это опечатка? Должно быть global_var?.
  3. Пространство до и после = в: $global_var_her = "bla". Это неправильный синтаксис в bash и в оболочке вообще.
  4. В левой части равенства есть $. Это не присваивается переменной global_var_her.
  5. Существует дополнительный _her, который кажется необходимым ООН.

Все исправлено, это должно работать:

global_var="" 

_DBINFO(){ 

    content=$(
     curl -su $AUTH https://<balla bla >/databases | 
     jq -c 'map(select(.plan.name != "Sandbox")) | .[] | {id, name}' 
    ) 

    while read -r db 
    do 
     idb=$(echo "$db" | jq -r '.id') 
     name=$(echo "$db" | jq -r '.name') 
     if [[ $name = '<bla>' ]]; then 
      global_var=$(echo "<bla value>") 
     fi 
    done <<<"$content" 

} 
Смежные вопросы