I bash scripting:
lager vi variabel ved å bare navngi den:
abc=ok
eller vi kan bruke declare
declare abc=ok
hva er forskjellen?
og hvorfor lager bash så mange måter å opprette en variabel på?
Kommentarer
Svar
Fra help -m declare
:
NAVN
declare
– Still variabelverdier og attributter.SYNOPSIS
declare
[-aAfFgilnrtux
] [-p
] [name
[=value
] …]BESKRIVELSE
Angi variabelverdier og attributter.
Deklarer variabler og gi dem attributter. Hvis ingen NAVN er gitt, kan du vise attributtene og verdiene til alle variablene.
Alternativer:
-f
begrense handling eller visning til funksjonsnavn og definisjoner
-F
begrense visningen til funksjonsnavn (pluss linjenummer og kildefil ved feilsøking)
-g
oppretter globale variabler når de brukes i en skallfunksjon; ellers ignorert
-p
viser attributtene og verdien av hvert NAVN
Alternativer som angir attributter:
-a
for å lage NAME-indekserte matriser (hvis støttet)
-A
for å lage NAMEs assosiative matriser (hvis støttet)
-i
for å få NAVN til attributtet heltall
-l
for å konvertere NAVN til små bokstaver ved tildeling
-n
gjør NAME til en referanse til variabelen oppkalt etter verdien
-r
for å få NAVN til bare
-t
for å få NAVN til å ha spore attributt
-u
for å konvertere NAVN til store bokstaver på oppdrag
-x
for å lage NAVN eksporter
Bruk
+
i stedet for-
slår av det gitte attributtet .Variabler med heltallattributtet har aritmetisk evaluering (se kommandoen
let
) når variabelen er tildelt en verdi.Når brukt i en funksjon, gjør
declare
NAVN lokale, som medlocal
-kommandoen. Alternativet-g
undertrykker denne oppførselen.Avslutt status:
Returnerer suksess med mindre et ugyldig alternativ leveres eller det oppstår en variabel tildelingsfeil.SE OGSÅ
bash (1)
IMPLEMENTERING
GNU bash, versjon 4.3.11 (1) -release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Lisens GPLv3 +: GNU GPL versjon 3 eller senere < http : //gnu.org/licenses/gpl.html >
Så, declare
brukes til å sette variabelverdier og attributter .
La meg vise bruken av to attributter med et veldig enkelt eksempel:
$ # 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
Fra eksemplet ovenfor synes jeg du bør forstå bruken av declare
variabel over normal variabel! Denne typen declare
ation er nyttig i funksjoner, sløyfer med skript.
Besøk også Skrivevariabler: erklær eller typesett
Kommentarer
- ja, " og attributter " er poenget! dette er forskjellen.
- Flott! Jeg elsker eksempler, den beste måten å lære / lære på. Takk!
- Du trenger å vite hva " attributter " er for å forstå dette svaret. De ' er egenskapene til variabelen som ' heltall ', ' array ', eller ' skrivebeskyttet '.
- Dette gjør en fin jobb med å forklare erklær, men ignorerer fullstendig hva som skjer når du bare erklærer en variabel gjennom bash.
Svar
abc=ok
tilordner en verdi til variabelen abc
. declare abc
erklærer en variabel kalt abc
. De to kan kombineres som declare abc=ok
.
I bash, som andre skjell, trenger ikke streng- og arrayvariabler deklareres, så declare
er ikke nødvendig med mindre du vil passere alternativer, f.eks declare -A abc
for å gjøre abc
til en assosiativ matrise eller declare -r
for å lage en variabel skrivebeskyttet. Inne i en funksjon gjør declare
imidlertid en forskjell: det fører til at variabelen er lokal for funksjonen, noe som betyr at verdien av variabelen utenfor funksjonen (hvis noen) er bevart . (Med mindre du bruker declare -g
, noe som gjør at variabelen ikke er lokal; dette er nyttig når det kombineres med andre alternativer, f.eks. declare -gA
for å skape en global assosiativ matrise i en funksjon.) Eksempel:
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"
Utgang:
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
En annen ting du kan gjøre med declare
innebygd er
declare
innebygd er unik for bash. Den er sterkt inspirert og veldig nær ksh «s typeset
innebygd, og bash gir typeset
som et synonym for declare
for kompatibilitet. (Jeg vet ikke hvorfor bash ikke bare kalte det typeset
). Der er et tredje synonym local
. Det er også export
, som er det samme som declare -x
, igjen for kompatibilitet (med alle Bourne-stil skall).
Kommentarer
- ja! ' og alternativ ' er poenget. p.s. hvis jeg designer bash, vil jeg la oppførselen til " erklære " gjøre noen ting i annen kondisjon. dette gjør ting enkelt.
- Fint svar. Et ytterligere spørsmål, hvilken blant
export
,local
ogdeclare
er den mest kompatible med andre skjell? - @ 0xc0de
export
finnes i alle varianter avsh
.local
eksisterer bare i bash og zsh,declare
bare i bash.typeset
finnes i ksh, bash og zsh.
declare
gjør NAVN lokale, som medlocal
-kommandoen. Alternativet-g
undertrykker denne oppførselen. Sehelp declare
.declare
gjør det mulig å lage assosiative matriser, heltall og lese- bare variabler. Det utvider også argumentene, så ting somdeclare $name=1
er mulig.