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:
-fbegränsa åtgärd eller visning till funktionsnamn och definitioner
-Fbegränsar visningen till funktionsnamn (plus radnummer och källfil vid felsökning)
-gskapa globala variabler när de används i en skalfunktion; ignoreras annars
-pvisa attribut och värde för varje NAMN
Alternativ som anger attribut:
-aför att göra NAME-indexerade matriser (om de stöds)
-Aför att göra NAMN till associerande matriser (om de stöds)
-iför att göra NAMN till attributet heltal
-lför att konvertera NAMN till små bokstäver vid tilldelning
-ngör NAME till en referens till variabeln som namnges av dess värde
-rför att göra NAMN till bara
-tför att få NAMN att ha spåra attribut
-uför att konvertera NAMN till versaler på uppdrag
-xfö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,
declaregör NAMN lokala, som med kommandotlocal.-gundertrycker 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,localochdeclareär den mest kompatibla med andra skal? - @ 0xc0de
exportfinns i alla varianter avsh.localfinns bara i bash och zsh,declarebara i bash.typesetfinns i ksh, bash och zsh.
declaregör NAMN lokala, som medlocal-kommandot. Alternativet-gundertrycker detta beteende. Sehelp declare.declaregö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.