I bash scripting, vad ' skiljer sig mellan deklarera och en normal variabel?

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

  • När den används i en funktion, declare gör NAMN lokala, som med local -kommandot. Alternativet -g undertrycker detta beteende. Se help declare.
  • declare gör det möjligt att skapa associerande matriser, heltal och läs- Endast variabler. Det utvidgar dess argument så att saker som declare $name=1 är möjliga.

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 kommandot local. -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 och declare är den mest kompatibla med andra skal?
  • @ 0xc0de export finns i alla varianter av sh. local finns bara i bash och zsh, declare bara i bash. typeset finns i ksh, bash och zsh.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *