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:
-fbegræns handlingen eller visningen til funktionsnavne og definitioner
-Fbegrænser kun visningsfunktionsnavne (plus linienummer og kildefil ved fejlretning)
-gskaber globale variabler, når de bruges i en shell-funktion; ellers ignoreret
-pvise attributter og værdi af hvert NAVN
Indstillinger, der angiver attributter:
-afor at lave NAME-indekserede arrays (hvis understøttet)
-Afor at gøre NAVNE associerende arrays (hvis understøttet)
-ifor at få NAVN til atributten heltal
-lfor at konvertere NAVNE til små bogstaver ved tildeling
-ngør NAME til en reference til variablen navngivet efter dens værdi
-rfor at gøre NAVNE til adonly
-tfor at få NAVN til at have spore attribut
-ufor at konvertere NAVNE til store bogstaver ved opgave
-xfor 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,
declaregør NAVNE lokale som med kommandoenlocal. Muligheden-gundertrykker 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,localogdeclareer det mest kompatible med andre skaller? - @ 0xc0de
exportfindes i alle varianter afsh.localfindes kun i bash og zsh,declarekun i bash.typesetfindes i ksh, bash og zsh.
declaregør NAVNE lokale som medlocalkommandoen. Indstillingen-gundertrykker denne adfærd. Sehelp declare.declaregør det muligt at oprette associerende arrays, heltal og læse kun variabler. Det udvider også sine argumenter, så ting somdeclare $name=1er mulige.