Was ' unterscheidet beim Bash-Scripting zwischen deklarieren und einer normalen Variablen?

In Bash-Skripten:

erstellen wir eine Variable, indem wir sie einfach benennen:

abc=ok 

oder wir können declare

declare abc=ok 

verwenden, was ist der Unterschied?

und warum bietet bash so viele Möglichkeiten, eine Variable zu erstellen?

Kommentare

  • Bei Verwendung in einer Funktion declare macht NAMEs lokal, wie mit dem Befehl local. Die Option -g unterdrückt dieses Verhalten. Siehe help declare.
  • declare ermöglicht das Erstellen von assoziativen Arrays, Ganzzahlen und Lese- Nur Variablen. Außerdem werden die Argumente erweitert, sodass Dinge wie declare $name=1 möglich sind.

Antwort

Von help -m declare:

NAME

    declare – Legen Sie Variablenwerte und Attribute fest.

    ÜBERSICHT

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

    BESCHREIBUNG

      Variablenwerte und Attribute festlegen.

      Variablen deklarieren und gib ihnen Attribute. Wenn keine NAMEs angegeben sind, zeigen Sie die Attribute und Werte aller Variablen an.

      Optionen:

        -f

          Aktion oder Anzeige auf Funktionsnamen und Definitionen beschränken

        -F

          beschränkt die Anzeige nur auf Funktionsnamen (plus Zeilennummer und Quelldatei beim Debuggen)

        -g

          Erstellen Sie globale Variablen, wenn Sie diese in einer Shell-Funktion verwenden. andernfalls ignoriert

        -p

          zeigt die Attribute und den Wert an von jedem NAME

      Optionen, die Attribute festlegen:

        -a

          , um NAMEs-indizierte Arrays zu erstellen (falls unterstützt)

        -A

          , um NAMEs assoziative Arrays zu erstellen (falls unterstützt)

        -i

          , damit NAMEs das Attribut integer haben

        -l

          , um NAMEs bei Zuweisung in Kleinbuchstaben umzuwandeln

        -n

          Machen Sie NAME zu einem Verweis auf die Variable, die nach ihrem Wert benannt ist.

          -r

            , um NAMEs erneut zu erstellen Nur

          -t

            , damit NAMEs das trace attribute

          -u

            zum Konvertieren von NAMEs in Großbuchstaben bei Zuweisung

          -x

            , um NAMEs zu erstellen Exportieren

        Verwenden von + anstelle von - deaktiviert das angegebene Attribut

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

        Wann In einer Funktion verwendet declare NAMEs lokal, wie mit dem Befehl local. Die Option -g unterdrückt dieses Verhalten.

        Exit Status:
        Gibt den Erfolg zurück, es sei denn, eine ungültige Option wird angegeben oder ein Fehler bei der Variablenzuweisung tritt auf.

        SIEHE AUCH

          bash (1)

        UMSETZUNG

          GNU Bash, Version 4.3.11 (1) -Veröffentlichung (i686-PC-Linux-Gnu)
          Copyright (C) 2013 Free Software Foundation, Inc.
          Lizenz GPLv3 +: GNU GPL Version 3 oder später < http : //gnu.org/licenses/gpl.html >


Also declare wird zum Festlegen von Variablenwerten und Attributen verwendet.

Lassen Sie mich die Verwendung von zwei zeigen Attribute mit einem sehr einfachen Beispiel:

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

Aus dem obigen Beispiel sollten Sie die Verwendung von declare Variable über normale Variable! Diese Art von declare ation ist nützlich in Funktionen, Schleifen mit Skripten.

Besuchen Sie auch Typvariablen: deklarieren oder Satz

Kommentare

  • Ja, die " und Attribute " ist der Punkt! Das ist der Unterschied.
  • Großartig! Ich liebe Beispiele, die beste Art zu lehren / lernen. Vielen Dank!
  • Sie müssen wissen, welche " Attribute " diese Antwort verstehen. Sie ' sind Eigenschaften der Variablen wie ' Ganzzahl ', ' Array ' oder ' schreibgeschützt '.
  • Dies erklärt die Deklaration sehr gut, ignoriert jedoch völlig, was passiert, wenn Sie eine Variable einfach durch bash deklarieren.

Antwort

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

In bash müssen wie in anderen Shells String- und Array-Variablen nicht deklariert werden, daher declare ist nicht erforderlich, es sei denn, Sie möchten Optionen übergeben, z declare -A abc, um abc zu einem assoziativen Array zu machen, oder declare -r, um eine Variable schreibgeschützt zu machen. Innerhalb einer Funktion macht declare 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 -gA, um eine globale Variable zu erstellen assoziatives Array in einer Funktion.) 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 

Ein anderes Was Sie mit dem eingebauten declare tun können, ist

Das eingebaute declare ist einzigartig für bash. Es ist stark inspiriert und sehr nah an kshs typeset eingebaut, und bash bietet typeset als Synonym für declare aus Kompatibilitätsgründen. (Ich weiß nicht, warum Bash es nicht einfach typeset genannt hat). Es gibt ein drittes Synonym, local. Es gibt auch export, was dasselbe ist wie declare -x, ebenfalls aus Kompatibilitätsgründen (mit jeder Shell im Bourne-Stil).

Kommentare

  • ja! Die ' und Option ' ist der Punkt. p.s. Wenn ich die Bash entwerfe, lasse ich das Verhalten von " deklarieren, dass " etwas in einem anderen Zustand tut. Das macht die Sache einfach.
  • Schöne Antwort. Eine weitere Frage, mit der unter export, local und declare am besten kompatibel ist andere Shells?
  • @ 0xc0de export ist in allen Varianten von sh vorhanden. local existiert nur in bash und zsh, declare nur in bash. typeset existiert in ksh, bash und zsh.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.