Was ist der Unterschied zwischen declare und einer normalen Variablen beim Bash-Scripting?

43

In Bash-Skripten:

Wir erstellen Variablen, indem wir sie einfach benennen:

abc=ok

oder wir können verwenden declare

declare abc=ok

was ist der Unterschied?

und warum bietet bash so viele möglichkeiten, eine variable zu erstellen?

Liebesfeder
quelle
6
Bei Verwendung in einer Funktion declarewird NAME wie beim localBefehl als lokal definiert . Die -gOption unterdrückt dieses Verhalten. Sehen help declare.
Cyrus
2
declareErmöglicht das Erstellen von assoziativen Arrays, Ganzzahlen und schreibgeschützten Variablen. Außerdem erweitert es seine Argumente, so dass Dinge wie declare $name=1möglich sind.
Choroba

Antworten:

34

Von help -m declare:

NAME

    declare - Setzen Sie variable Werte und Attribute.

ZUSAMMENFASSUNG

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

BESCHREIBUNG

    Legen Sie variable Werte und Attribute fest.

    Deklarieren Sie Variablen und geben Sie ihnen Attribute. Wenn keine NAMEN angegeben sind, zeigen Sie die Attribute und Werte aller Variablen an.

    Optionen:

      -f
        Beschränken Sie die Aktion oder Anzeige auf Funktionsnamen und -definitionen
      -F
        Anzeige nur auf Funktionsnamen beschränken (plus Zeilennummer und Quelldatei beim Debuggen)
      -g
        Erstellen Sie globale Variablen, wenn Sie in einer Shell-Funktion verwendet werden. sonst ignoriert
      -p
        Zeigen Sie die Attribute und den Wert jedes NAMENS an

    Optionen, die Attribute setzen:

      -a
        Indizierte NAME-Arrays erstellen (falls unterstützt)
      -A
        Assoziative NAME-Arrays erstellen (falls unterstützt)
      -i
        NAMEN haben das Attribut 'integer'
      -l
        NAMEs bei Zuweisung in Kleinbuchstaben umwandeln
      -n
        Machen Sie NAME zu einem Verweis auf die Variable, die nach ihrem Wert benannt ist
      -r
        NAMEN nur lesbar zu machen
      -t
        NAMEN zu machen, haben das Attribut 'trace'
      -u
        um NAMEs bei der Zuweisung in Großbuchstaben umzuwandeln
      -x
        NAMEs exportieren zu lassen

    Durch die Verwendung von ' +' anstelle von ' -' wird das angegebene Attribut deaktiviert.

    Variablen mit dem Integer-Attribut werden arithmetisch ausgewertet (siehe letBefehl), wenn der Variablen ein Wert zugewiesen wird.

    Bei Verwendung in einer Funktion declarewird NAME wie beim local Befehl als lokal definiert . Die -gOption ' ' unterdrückt dieses Verhalten.

    Exit Status:
    Gibt Erfolg zurück, sofern keine ungültige Option angegeben wurde oder ein Fehler bei der Variablenzuweisung auftritt.

SIEHE AUCH

    Bash (1)

IMPLEMENTIERUNG

    GNU Bash, Version 4.3.11 (1) -Release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Lizenz GPLv3 +: GNU GPL Version 3 oder höher <http://gnu.org/ licenses / gpl.html>


Wird declarealso zum Festlegen von Variablenwerten und Attributen verwendet .

Lassen Sie mich die Verwendung von zwei Attributen anhand eines sehr einfachen Beispiels zeigen:

$ # 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

Anhand des obigen Beispiels sollten Sie die Verwendung von declareVariablen über normale Variablen verstehen ! Diese Art von declareFunktion ist nützlich in Funktionen, Schleifen mit Skripten.

Besuchen Sie auch Typing variables: declare oder typeset

Pandya
quelle
Ja, das "und Attribute" ist der Punkt! das ist der unterschied.
lovespring
Toll! Ich liebe Beispiele, beste Art zu lehren / lernen. Vielen Dank!
Türkenh
1
Sie müssen wissen, was "Attribute" sind, um diese Antwort zu verstehen. Sie sind Eigenschaften der Variablen wie 'integer', 'array' oder 'readonly'.
Noumenon
11

abc=okWeist der Variablen einen Wert zu abc. declare abcdeklariert eine Variable namens abc. Die beiden können kombiniert werden als declare abc=ok.

In bash müssen String- und Array-Variablen wie andere Shells nicht deklariert werden. Dies declareist nur erforderlich, wenn Sie Optionen übergeben möchten, z. B. declare -A abcum abcein assoziatives Array zu erstellen oder declare -reine Variable schreibgeschützt zu machen. Innerhalb einer Funktion declaremacht es jedoch einen Unterschied: Es bewirkt, dass die Variable lokal für die Funktion ist, was bedeutet, dass der Wert der Variablen außerhalb der Funktion (falls vorhanden) beibehalten wird. (Es sei denn, Sie verwenden declare -g, wodurch die Variable nicht lokal wird. Dies ist nützlich, wenn Sie sie mit anderen Optionen kombinieren, z. B. declare -gAum ein globales assoziatives Array in einer Funktion zu erstellen.) Beispiel:

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"

Ausgabe:

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

Eine andere Sache, die Sie mit dem declareeingebauten tun können, ist

Das declareeingebaute ist einzigartig zu schlagen. Es ist stark inspiriert und kommt dem von ksh sehr nahe. typesetBash ist typesetein Synonym declarefür Kompatibilität. (Ich weiß nicht, warum bash es nicht einfach genannt hat typeset). Es gibt ein drittes Synonym local. Es gibt aus Kompatibilitätsgründen (mit jeder Bourne-artigen Shell) auch exportdas Gleiche wie declare -x.

Gilles 'SO - hör auf böse zu sein'
quelle
Ja! Das 'und die Option' ist der Punkt. ps wenn ich die bash entwerfe, lasse ich das verhalten von "declare" etwas unter anderen bedingungen tun. das macht die Sache einfach.
lovespring
Gute Antwort. Eine weitere Frage, die man unter export, localund declareist kompatibel mit den meisten anderen Shells?
0xc0de
1
@ 0xc0de exportexistiert in allen Varianten von sh. localexistiert nur in bash und zsh, declarenur in bash. typesetexistiert in ksh, bash und zsh.
Gilles 'SO- hör auf böse zu sein'