W skrypcie bash czym różni się deklaracja od zmiennej normalnej?


43

W skryptach bash:

tworzymy zmienną, nazywając ją:

abc=ok

lub możemy użyć declare

declare abc=ok

co za różnica?

i dlaczego bash oferuje tak wiele sposobów tworzenia zmiennej?


6
Gdy jest używany w funkcji, declareczyni NAME lokalnymi, tak jak w localpoleceniu. Ta -gopcja tłumi to zachowanie. Zobaczyć help declare.
Cyrus

2
declareumożliwia tworzenie tablic asocjacyjnych, liczb całkowitych i zmiennych tylko do odczytu. Ponadto rozszerza swoje argumenty, więc declare $name=1możliwe są takie rzeczy .
choroba

Odpowiedzi:


34

Od help -m declare:

IMIĘ

    declare - Ustaw wartości zmiennych i atrybuty.

STRESZCZENIE

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

OPIS

    Ustaw wartości zmiennych i atrybuty.

    Deklaruj zmienne i nadaj im atrybuty. Jeśli nie podano NAME, wyświetl atrybuty i wartości wszystkich zmiennych.

    Opcje:

      -f
        ograniczyć akcję lub wyświetlanie do nazw i definicji funkcji
      -F
        ogranicz wyświetlanie tylko do nazw funkcji (plus numer linii i plik źródłowy podczas debugowania)
      -g
        tworzyć zmienne globalne, gdy są używane w funkcji powłoki; inaczej ignorowane
      -p
        wyświetlać atrybuty i wartość każdego NAZWY

    Opcje, które ustawiają atrybuty:

      -a
        tworzyć indeksowane tablice NAME (jeśli są obsługiwane)
      -A
        tworzyć tablice asocjacyjne NAME (jeśli są obsługiwane)
      -i
        aby NAME miały atrybut „liczba całkowita”
      -l
        do konwersji NAME na małe litery przy przypisaniu
      -n
        uczyń NAME odwołaniem do zmiennej nazwanej jej wartością
      -r
        aby NAMEs były tylko do odczytu
      -t
        aby NAME miały atrybut „trace”
      -u
        konwertować NAZWY na wielkie litery przy przypisaniu
      -x
        aby eksportować NAME

    Użycie „ +” zamiast „ -” wyłącza podany atrybut.

    Zmienne z atrybutem liczby całkowitej mają obliczenia arytmetyczne (patrz letkomenda) wykonywane, gdy zmienna ma przypisaną wartość.

    Gdy jest używany w funkcji, declareczyni NAME lokalnymi, tak jak w local poleceniu. Opcja „ -g” tłumi to zachowanie.

    Status wyjścia:
    Zwraca sukces, chyba że podano niepoprawną opcję lub wystąpił błąd przypisania zmiennej.

ZOBACZ TEŻ

    bash (1)

REALIZACJA

    GNU bash, wersja 4.3.11 (1) - wydanie (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licencja GPLv3 +: GNU GPL wersja 3 lub nowsza <http://gnu.org/ licencje / gpl.html>


Tak, declarejest używany do ustawiania wartości zmiennych i atrybutów .

Pokażę użycie dwóch atrybutów na bardzo prostym przykładzie:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

Z powyższego przykładu uważam, że powinieneś zrozumieć użycie declarezmiennej zamiast zmiennej normalnej! Ten rodzaj declareacji jest użyteczny w funkcjach, pętlach ze skryptami.

Zobacz także Zmienne do wpisywania: deklaruj lub skład


tak, chodzi o „i atrybuty”! to jest różnica.
lovespring 11.01.16

Wspaniały! Uwielbiam przykłady, najlepszy sposób na nauczanie / uczenie się. Dzięki!
turkenh,

1
Musisz wiedzieć, jakie „atrybuty” mają zrozumieć ta odpowiedź. Są właściwościami zmiennej, takiej jak „liczba całkowita”, „tablica” lub „tylko do odczytu”.
Noumenon

11

abc=okprzypisuje wartość do zmiennej abc. declare abcdeklaruje zmienną o nazwie abc. Oba można połączyć jako declare abc=ok.

W bash, podobnie jak inne muszli, String i array zmienne nie muszą być zadeklarowane, więc declarenie jest konieczne, chyba że chcesz przekazać opcje, na przykład declare -A abc, aby abctablicę asocjacyjną lub declare -rdokonać zmienna tylko do odczytu. Jednak wewnątrz funkcji declarerobi różnicę: powoduje, że zmienna jest lokalna dla funkcji, co oznacza, że ​​wartość zmiennej poza funkcją (jeśli istnieje) jest zachowana. (O ile nie użyjesz declare -g, co powoduje, że zmienna nie jest lokalna; jest to przydatne w połączeniu z innymi opcjami, np. W declare -gAcelu utworzenia globalnej tablicy asocjacyjnej w funkcji.) Przykład:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

Wynik:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

Inną rzeczą, którą możesz zrobić z declarewbudowanym programem, jest

declareWbudowane jest unikalny dla bash. Jest mocno inspirowany i bardzo zbliżony do typesetwbudowanego ksh , a bash stanowi typesetsynonim declarekompatybilności. (Nie wiem, dlaczego bash tak go nie nazwał typeset). Nie ma trzeciej synonimem local. Jest również export, co jest to samo, co declare -xdla kompatybilności (z każdą powłoką w stylu Bourne'a).


tak! chodzi o „i opcja”. ps, jeśli zaprojektuję bash, pozwolę zachowaniu się „deklarować”, że zrobię coś w inny sposób. dzięki temu wszystko jest proste.
lovespring 11.01.16

Niezła odpowiedź. Kolejną kwestią, która jednym export, locali declarejest najbardziej kompatybilny z innymi muszli?
0xc0de

1
@ 0xc0de exportistnieje we wszystkich wariantach sh. localistnieje tylko w bash i zsh, declaretylko w bash. typesetistnieje w ksh, bash i zsh.
Gilles „SO- przestań być zły”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.