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
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:
-fogranicz działanie lub wyświetlanie do nazw i definicji funkcji
-Fogranicz wyświetlanie tylko do nazw funkcji (plus numer linii i plik źródłowy podczas debugowania)
-gutwórz zmienne globalne, gdy są używane w funkcji powłoki; w przeciwnym razie ignorowane
-pwyś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”
-laby przekonwertować NAZWY na małe litery przy przypisaniu
-nuczyń 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,
declaresprawia, że NAZWA są lokalne, tak jak w przypadku polecenialocal. 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,localideclarejest najbardziej zgodne z inne powłoki? - @ 0xc0de
exportwystępuje we wszystkich wariantachsh.localistnieje tylko w bash i zsh,declaretylko w bash.typesetistnieje w ksh, bash i zsh.
declareustawia NAZWA lokalnie, tak jak w przypadku polecenialocal. Opcja-gblokuje to zachowanie. Zobaczhelp declare.declareumożliwia tworzenie tablic asocjacyjnych, liczb całkowitych i read- tylko zmienne. Ponadto rozszerza swoje argumenty, więc możliwe są rzeczy takie jakdeclare $name=1.