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:
-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 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
,local
ideclare
jest najbardziej zgodne z inne powłoki? - @ 0xc0de
export
występuje we wszystkich wariantachsh
.local
istnieje tylko w bash i zsh,declare
tylko w bash.typeset
istnieje w ksh, bash i zsh.
declare
ustawia NAZWA lokalnie, tak jak w przypadku polecenialocal
. Opcja-g
blokuje to zachowanie. Zobaczhelp 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 jakdeclare $name=1
.