Mitä ' eroaa bash-komentosarjoissa deklaroitavan ja normaalin muuttujan välillä?

Bash-komentosarjoissa:

luomme muuttujan vain nimeämällä sen:

abc=ok 

tai voimme käyttää declare

declare abc=ok 

mikä ero on?

ja miksi bash tekee niin monia tapoja luoda muuttuja?

Kommentit

  • Kun sitä käytetään funktiossa, declare tekee NAME-nimistä paikalliset, kuten komennon local yhteydessä. Vaihtoehto -g estää tämän toiminnan. Katso help declare.
  • declare mahdollistaa assosiatiivisten taulukoiden, kokonaislukujen ja luku- vain muuttujat. Lisäksi se laajentaa argumenttejaan, joten esimerkiksi declare $name=1 ovat mahdollisia.

Vastaa

Lähettäjä help -m declare:

NIMI

    declare – Aseta muuttujan arvot ja määritteet.

SYNOPSIS

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

KUVAUS

    Aseta muuttujien arvot ja määritteet.

    Ilmoita muuttujat ja anna heille määritteet. Jos NAME-nimiä ei anneta, näytä kaikkien muuttujien määritteet ja arvot.

    Vaihtoehdot:

      -f

        rajoita toiminto tai näyttö toimintojen nimiin ja määritelmiin

      -F

        rajoita näyttö vain toimintojen nimiin (plus rivinumero ja lähdetiedosto virheenkorjauksessa)

      -g

        luo globaaleja muuttujia, kun niitä käytetään kuoritoiminnossa; muuten ohitettu

      -p

        näyttää määritteet ja arvon jokaisen NIMEN nimi

    Määritteet asettavat vaihtoehdot:

      -a

        tehdäksesi NAME-indeksoituja taulukoita (jos niitä tuetaan)

      -A

        NAMEs-assosiatiivisten taulukoiden muodostamiseksi (jos tuettu)

      -i

        , jotta NIMILLE saadaan attribuutti kokonaisluku

      -l

        muuntaa NAME-tiedostot pieniksi kirjaimiksi tehtävässä

      -n

        tee NAME viitteeksi muuttujalle, jonka nimi on sen arvo

      -r

        saadaksesi NAME uudelleensuuntautumaan adonly

      -t

        , jotta NIMILLE olisi trace attribute

      -u

        muuntaa NAME-tiedostot isot kirjaimet tehtävässä

      -x

        tehdä nimiä NAME vienti

    Käyttämällä + merkinnän - sijasta sammuttaa annetun attribuutin .

    Kokonaisluku-attribuutilla varustetuilla muuttujilla on aritmeettinen arviointi (katso komento let), kun muuttujalle on annettu arvo.

    Kun käytetään funktiossa, declare tekee NAME-nimistä paikalliset, kuten komennossa local. Vaihtoehto -g estää tämän toiminnan.

    Poistumistila:
    Palauttaa onnistumisen, ellei toimiteta virheellistä vaihtoehtoa tai tapahtuu muuttujan määritysvirhe.

KATSO MYÖS

    bash (1)

TOTEUTUS

    GNU bash, versio 4.3.11 (1) -julkaisu (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Lisenssi GPLv3 +: GNU GPL -versio 3 tai uudempi < http : //gnu.org/licenses/gpl.html >


Joten, declare -asetusta käytetään muuttujien arvojen ja määritteiden asettamiseen.

Haluan näyttää kahden käytön määritteet hyvin yksinkertaisella esimerkillä:

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

Yllä olevasta esimerkistä mielestäni sinun pitäisi ymmärtää declare muuttuja normaalimuuttujan yli! Tämän tyyppinen declare ation on hyödyllinen funktioissa, komentosarjoilla varustetuissa silmukoissa.

Käy myös osoitteessa Kirjoitusmuuttujat: deklaroi tai typet

Kommentit

  • kyllä, " ja määritteet " on asia! tämä on ero.
  • Hienoa! Rakastan esimerkkejä, paras tapa opettaa / oppia. Kiitos!
  • Sinun on tiedettävä, mitä " määritteet " ymmärtävät tämän vastauksen. Ne ' muuttavat muuttujan ominaisuuksia, kuten ' kokonaisluku ', ' taulukko ' tai ' vain lukea '.
  • Tämä tekee hyvää työtä selittämällä ilmoitusta, mutta jättää täysin huomiotta sen, mitä tapahtuu, kun yksinkertaisesti ilmoitat muuttujan bashin kautta.

Vastaa

abc=ok määrittää arvon muuttujalle abc. declare abc julistaa muuttujan nimeltä abc. Nämä kaksi voidaan yhdistää nimellä declare abc=ok.

Bashissa, kuten muissakin kuoreissa, merkkijono- ja matriisimuuttujia ei tarvitse ilmoittaa, joten declare ei ole tarpeen, ellet halua välittää vaihtoehtoja, esim declare -A abc tehdäksesi abc assosiatiivisen taulukon tai declare -r muuttujan olevan vain luku -muodossa. Funktion sisällä declare kuitenkin vaikuttaa: se saa muuttujan paikallistamaan funktion, mikä tarkoittaa, että funktion ulkopuolella olevan muuttujan (jos sellainen on) arvo säilyy . (Ellet käytä declare -g -toimintoa, jolloin muuttuja ei ole paikallinen; tämä on hyödyllinen yhdistettynä muihin asetuksiin, esim. declare -gA luoda globaali assosiatiivinen taulukko funktiossa.) Esimerkki:

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" 

Tulos:

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 

Toinen asia, jonka voit tehdä sisäänrakennetulla declare, on

Sisäänrakennettu declare on ainutlaatuinen bashille. Se on voimakkaasti innoittamana ja hyvin lähellä ksh ”s typeset sisäänrakennettua, ja bash tarjoaa typeset synonyyminä declare yhteensopivuutta varten. (En tiedä miksi bash ei vain kutsunut sitä typeset). Siellä ”on kolmas synonyymi, local. Siellä on myös export, joka on sama kuin declare -x, jälleen yhteensopivuuden vuoksi (jokaisen Bourne-tyylisen kuoren kanssa).

kommentit

  • kyllä! ' ja vaihtoehto ' on kohta. p.s. jos suunnittelen bashin, annan " -käyttäytymisen julistaa " -toiminnon tekevän jotakin erilaista. tämä tekee asioista yksinkertaisia.
  • Hyvä vastaus. Toinen kysymys, kumpi joukosta export, local ja declare on eniten yhteensopiva muut kuoret?
  • @ 0xc0de export on kaikissa sh -versioissa. local on olemassa vain bash ja zsh, declare vain bash. typeset on tiedostoissa ksh, bash ja zsh.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *