I bash scripting:
opretter vi variabel ved blot at navngive den:
abc=ok
eller vi kan bruge declare
declare abc=ok
hvad er forskellen?
og hvorfor laver bash så mange måder at oprette en variabel på?
Kommentarer
Svar
Fra help -m declare
:
NAVN
declare
– Indstil variable værdier og attributter.SYNOPSIS
declare
[-aAfFgilnrtux
] [-p
] [name
[=value
] …]BESKRIVELSE
Indstil variable værdier og attributter.
Erklær variabler og giv dem attributter. Hvis der ikke er angivet NAVNE, skal du vise attributterne og værdierne for alle variabler.
Valgmuligheder:
-f
begræns handlingen eller visningen til funktionsnavne og definitioner
-F
begrænser kun visningsfunktionsnavne (plus linienummer og kildefil ved fejlretning)
-g
skaber globale variabler, når de bruges i en shell-funktion; ellers ignoreret
-p
vise attributter og værdi af hvert NAVN
Indstillinger, der angiver attributter:
-a
for at lave NAME-indekserede arrays (hvis understøttet)
-A
for at gøre NAVNE associerende arrays (hvis understøttet)
-i
for at få NAVN til atributten heltal
-l
for at konvertere NAVNE til små bogstaver ved tildeling
-n
gør NAME til en reference til variablen navngivet efter dens værdi
-r
for at gøre NAVNE til adonly
-t
for at få NAVN til at have spore attribut
-u
for at konvertere NAVNE til store bogstaver ved opgave
-x
for at oprette NAVNE eksport
Brug af
+
i stedet for-
deaktiverer den givne attribut .Variabler med heltalattributten har aritmetisk evaluering (se kommandoen
let
), når variablen tildeles en værdi.Når bruges i en funktion,
declare
gør NAVNE lokale som med kommandoenlocal
. Muligheden-g
undertrykker denne adfærd.Afslut status:
Returnerer succes, medmindre en ugyldig mulighed leveres, eller der opstår en variabel tildelingsfejl.SE OGSÅ
bash (1)
IMPLEMENTERING
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 senere < http : //gnu.org/licenses/gpl.html >
Så declare
bruges til at indstille variable værdier og attributter .
Lad mig vise brugen af to attributter med et meget simpelt 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 ovenstående eksempel synes jeg, du skal forstå brugen af declare
variabel over normal variabel! Denne type declare
ation er nyttig i funktioner, sløjfer med scripting.
Besøg også Typevariabler: erklær eller typesæt
Kommentarer
- ja, " og attributter " er pointen! dette er forskellen.
- Fantastisk! Jeg elsker eksempler, den bedste måde at undervise / lære på. Tak!
- Du skal vide, hvad " attributter " er for at forstå dette svar. De ' er egenskaberne for variablen som ' heltal ', ' array ' eller ' skrivebeskyttet '. li>
- Dette gør et godt stykke arbejde med at forklare erklær, men ignorerer fuldstændigt, hvad der sker, når du blot erklærer en variabel gennem bash.
Svar
abc=ok
tildeler en værdi til variablen abc
. declare abc
erklærer en variabel kaldet abc
. De to kan kombineres som declare abc=ok
.
I bash, som andre skaller, skal streng- og array-variabler ikke erklæres, så declare
er ikke nødvendigt, medmindre du vil videregive indstillinger, f.eks declare -A abc
for at gøre abc
til et associerende array eller declare -r
for at gøre en variabel skrivebeskyttet. Inde i en funktion gør declare
dog en forskel: det får variablen til at være lokal for funktionen, hvilket betyder, at værdien af variablen uden for funktionen (hvis nogen) bevares . (Medmindre du bruger declare -g
, hvilket gør variablen ikke lokal; dette er nyttigt, når det kombineres med andre muligheder, f.eks. declare -gA
for at skabe et globalt associativ matrix i en funktion.) 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"
Output:
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 anden ting du kan gøre med declare
indbygget er
declare
indbygget er unik for bash. Det er stærkt inspireret og meget tæt på ksh “s typeset
indbygget, og bash giver typeset
som et synonym for declare
for kompatibilitet. (Jeg ved ikke, hvorfor bash ikke bare kaldte det typeset
). Der er et tredje synonym local
. Der er også export
, hvilket er det samme som declare -x
, igen for kompatibilitet (med hver Bourne-stil shell).
Kommentarer
- ja! ' og indstilling ' er pointen. p.s. hvis jeg designer bash, vil jeg lade " erklære " gøre nogle ting i forskellige forhold. dette gør tingene enkle.
- Dejligt svar. Et yderligere spørgsmål, hvilket blandt
export
,local
ogdeclare
er det mest kompatible med andre skaller? - @ 0xc0de
export
findes i alle varianter afsh
.local
findes kun i bash og zsh,declare
kun i bash.typeset
findes i ksh, bash og zsh.
declare
gør NAVNE lokale som medlocal
kommandoen. Indstillingen-g
undertrykker denne adfærd. Sehelp declare
.declare
gør det muligt at oprette associerende arrays, heltal og læse kun variabler. Det udvider også sine argumenter, så ting somdeclare $name=1
er mulige.