Czym ' w skryptach basha różni się deklaracja od zwykłej zmiennej?

W skryptach basha:

tworzymy zmienną, nazywając ją po prostu:

abc=ok 

lub możemy użyć declare

declare abc=ok 

Jaka jest różnica?

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

Komentarze

  • Gdy jest używany w funkcji, declare ustawia NAZWA lokalnie, tak jak w przypadku polecenia local. Opcja -g blokuje to zachowanie. Zobacz help declare.
  • declare umożliwia tworzenie tablic asocjacyjnych, liczb całkowitych i read- tylko zmienne. Ponadto rozszerza swoje argumenty, więc możliwe są rzeczy takie jak declare $name=1.

Odpowiedź

From help -m declare:

NAZWA

    declare – Ustaw wartości zmiennych i atrybuty.

SKŁADNIA

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

OPIS

    Ustaw wartości i atrybuty zmiennych.

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

    Opcje:

      -f

        ogranicz działanie 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

        utwórz zmienne globalne, gdy są używane w funkcji powłoki; w przeciwnym razie ignorowane

      -p

        wyświetl atrybuty i wartość of each NAME

    Opcje ustawiające atrybuty:

      -a

        , aby utworzyć tablice indeksowane NAME (jeśli są obsługiwane)

      -A

        , aby utworzyć tablice asocjacyjne NAME (jeśli są obsługiwane)

      -i

        , aby NAZWY miały atrybut „liczba całkowita”

      -l

        aby przekonwertować NAZWY na małe litery przy przypisaniu

      -n

        uczyń z NAME odniesienie do zmiennej nazwanej na podstawie jej wartości

      -r

        , aby zmienić NAZWY adonly

      -t

        , aby NAZWY miały „ trace attribute

      -u

        , aby przekonwertować NAZWY na wielkie litery w przypisaniu

      -x

        , aby utworzyć NAZWY eksportuj

    Używanie + „zamiast„ - ”wyłącza dany atrybut .

    Zmienne z atrybutem liczby całkowitej mają obliczenie arytmetyczne (zobacz polecenie let) wykonywane, gdy zmiennej zostanie przypisana wartość.

    Kiedy użyty w funkcji, declare sprawia, że NAZWA są lokalne, tak jak w przypadku polecenia local. Opcja „ -g ” eliminuje to zachowanie.

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

ZOBACZ RÓWNIEŻ

    bash (1)

WDROŻENIE

    GNU bash, wersja 4.3.11 (1) -release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licencja GPLv3 +: GNU GPL wersja 3 lub później < http : //gnu.org/licenses/gpl.html >


A więc declare służy do ustawiania wartości zmiennych i atrybutów .

Pokażę użycie dwóch atrybuty z bardzo prostym przykładem:

$ # 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 

Myślę, że z powyższego przykładu powinieneś zrozumieć użycie declare zmienna nad normalną zmienną! Ten typ declare acji jest przydatny w funkcjach, pętlach ze skryptami.

Odwiedź także Wpisywanie zmiennych: deklaruj lub składa

Komentarze

  • tak, " i atrybuty " jest najważniejszy! na tym polega różnica.
  • Świetnie! Uwielbiam przykłady, najlepszy sposób nauczania / uczenia się. Dzięki!
  • Musisz wiedzieć, jakie " atrybuty " są, aby zrozumieć tę odpowiedź. Są ' właściwościami zmiennej, takimi jak ' integer ', ' array ' lub ' readonly '.
  • To niezła robota wyjaśniająca deklarację, ale całkowicie ignoruje to, co się dzieje, gdy po prostu deklarujesz zmienną przez bash.

Odpowiedz

abc=ok przypisuje wartość zmiennej abc. declare abc deklaruje zmienną o nazwie abc. Można je połączyć jako declare abc=ok.

W bashu, podobnie jak w innych powłokach, zmienne łańcuchowe i tablicowe nie muszą być deklarowane, więc declare nie jest konieczne, chyba że chcesz przekazać opcje, np. declare -A abc, aby utworzyć abc tablicę asocjacyjną lub declare -r, aby zmienna była tylko do odczytu. Jednak wewnątrz funkcji declare robi różnicę: powoduje, że zmienna jest lokalna dla funkcji, co oznacza, że wartość zmiennej poza funkcją (jeśli istnieje) jest zachowana . (Chyba że używasz declare -g, co powoduje, że zmienna nie jest lokalna; jest to przydatne w połączeniu z innymi opcjami, np. declare -gA do utworzenia globalnej tablica asocjacyjna 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 

Inny rzeczą, którą możesz zrobić z wbudowanym declare, jest

Wbudowany declare jest unikalny dla basha. Jest mocno zainspirowany i bardzo bliski ksh „s typeset wbudowanemu, a bash dostarcza typeset jako synonim declare w celu zapewnienia zgodności. (Nie wiem, dlaczego bash nie nazwał tego po prostu typeset). Jest „trzeci synonim local. Jest też export, czyli to samo co declare -x, ponownie dla kompatybilności (z każdą powłoką w stylu Bournea).

Komentarze

  • tak! chodzi o ' i opcję '. p.s. jeśli zaprojektuję bash, pozwolę zachowaniu " zadeklarować " zrobić coś w innych warunkach. to upraszcza sprawę.
  • Dobra odpowiedź. Kolejne pytanie, które spośród export, local i declare jest najbardziej zgodne z inne powłoki?
  • @ 0xc0de export występuje we wszystkich wariantach sh. local istnieje tylko w bash i zsh, declare tylko w bash. typeset istnieje w ksh, bash i zsh.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *