I bash-skript:
skapar vi variabel genom att bara namnge den:
abc=ok
eller så kan vi använda declare
declare abc=ok
vad är skillnaden?
och varför gör bash så många sätt att skapa en variabel?
Kommentarer
Svar
Från help -m declare
:
NAMN
declare
– Ställ in variabla värden och attribut.SYNOPSIS
declare
[-aAfFgilnrtux
] [-p
] [name
[=value
] …]BESKRIVNING
Ställ in variabla värden och attribut.
Förklara variabler och ge dem attribut. Om inga NAMN anges, visa attributen och värdena för alla variabler.
Alternativ:
-f
begränsa åtgärd eller visning till funktionsnamn och definitioner
-F
begränsar visningen till funktionsnamn (plus radnummer och källfil vid felsökning)
-g
skapa globala variabler när de används i en skalfunktion; ignoreras annars
-p
visa attribut och värde för varje NAMN
Alternativ som anger attribut:
-a
för att göra NAME-indexerade matriser (om de stöds)
-A
för att göra NAMN till associerande matriser (om de stöds)
-i
för att göra NAMN till attributet heltal
-l
för att konvertera NAMN till små bokstäver vid tilldelning
-n
gör NAME till en referens till variabeln som namnges av dess värde
-r
för att göra NAMN till bara
-t
för att få NAMN att ha spåra attribut
-u
för att konvertera NAMN till versaler på uppdrag
-x
för att skapa NAMN exportera
Använda
+
istället för-
stänger av det angivna attributet .Variabler med attributet heltal har aritmetisk utvärdering (se kommandot
let
) när variabeln tilldelas ett värde.När används i en funktion,
declare
gör NAMN lokala, som med kommandotlocal
.-g
undertrycker detta beteende.Avslutningsstatus:
Returnerar framgång om inte ett ogiltigt alternativ tillhandahålls eller om ett variabelt tilldelningsfel inträffar.SE OCH
bash (1)
GENOMFÖRANDE
GNU bash, version 4.3.11 (1) -release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Licens GPLv3 +: GNU GPL version 3 eller senare < http : //gnu.org/licenses/gpl.html >
Så, declare
används för att ställa in variabla värden och attribut .
Låt mig visa användningen av två attribut med ett mycket enkelt exempel:
$ # 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
Från ovanstående exempel tycker jag att du borde förstå användningen av declare
variabel över normal variabel! Denna typ av declare
ation är användbar i funktioner, loopar med skript.
Besök även Skrivvariabler: deklarera eller typ
Kommentarer
- ja, " och attribut " är poängen! det här är skillnaden.
- Bra! Jag älskar exempel, det bästa sättet att undervisa / lära. Tack!
- Du måste veta vad " attribut " är för att förstå detta svar. De ' är egenskaper hos variabeln som ' heltal ', ' array ', eller ' läsbart '.
- Det här är ett bra jobb med att förklara deklarera, men ignorerar helt vad som händer när du helt enkelt deklarerar en variabel genom bash.
Svar
abc=ok
tilldelar variabeln ett värde till abc
. declare abc
förklarar en variabel som heter abc
. De två kan kombineras som declare abc=ok
.
I bash, som andra skal, behöver inte sträng- och arrayvariabler deklareras, så declare
är inte nödvändigt om du inte vill skicka alternativ, t.ex. declare -A abc
för att göra abc
till en associerande array eller declare -r
för att göra en variabel skrivskyddad. Inom en funktion gör dock declare
skillnad: det gör att variabeln är lokal för funktionen, vilket innebär att värdet på variabeln utanför funktionen (om någon) bevaras . (Om du inte använder declare -g
, vilket gör att variabeln inte är lokal. Detta är användbart när det kombineras med andra alternativ, t.ex. declare -gA
för att skapa en global associativ matris i en funktion.) Exempel:
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"
Utdata:
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
Ytterligare sak du kan göra med declare
inbyggt är
declare
inbyggt är unikt för bash. Det är starkt inspirerat och mycket nära ksh ”s typeset
inbyggt, och bash ger typeset
som en synonym för declare
för kompatibilitet. (Jag vet inte varför bash inte bara kallade det typeset
). Där är en tredje synonym local
. Det finns också export
, vilket är samma som declare -x
, igen för kompatibilitet (med alla skal i Bourne-stil).
Kommentarer
- ja! ' och alternativet ' är poängen. p.s. om jag designar bash, låter jag beteendet av " förklara " göra något i annan form. detta gör det enkelt.
- Trevligt svar. En ytterligare fråga, vilken bland
export
,local
ochdeclare
är den mest kompatibla med andra skal? - @ 0xc0de
export
finns i alla varianter avsh
.local
finns bara i bash och zsh,declare
bara i bash.typeset
finns i ksh, bash och zsh.
declare
gör NAMN lokala, som medlocal
-kommandot. Alternativet-g
undertrycker detta beteende. Sehelp declare
.declare
gör det möjligt att skapa associerande matriser, heltal och läs- Endast variabler. Det utvidgar dess argument så att saker somdeclare $name=1
är möjliga.