GNU/Linux >> Znalost Linux >  >> Linux

Expanze proměnné Shell a účinek globusu a rozdělení na něj?

Tento příspěvek ve skutečnosti obsahuje dvě samostatné otázky, ale myslím, že jejich seskupení dohromady poskytne více kontextu. Prošel jsem tuto otázku ohledně uvozovek kolem proměnných, ale úplně nerozumím tomu, co rozšíření proměnné znamenat na prvním místě. Moje první otázka tedy zní:

  1. Co je rozšíření proměnné v unixu/linuxu mluvit?

Druhá část mé otázky se týká následujících termínů:

  1. globe
  2. rozdělit

Co výše uvedené znamenají a jak ovlivňují proměnnou expanzi? Odpověď na původní otázku zmiňuje následující:

Představte si absenci uvozovek (v kontextu seznamu) jako operátor split+glob
.

Jako kdyby echo $test byl echo glob(split(“$test”)).

Nenašel jsem žádné odpovědi, které by přímo řešily koncept globbingu a rozdělení ale spíše používá tyto termíny přímo při zodpovězení dalších otázek, jako je tato nedávná.

Přijatá odpověď:

Rozšíření proměnné (standardní termín je rozšíření parametrů a někdy se tomu také říká variabilní substituce ) v podstatě znamená nahrazení proměnné její hodnotou. Přesněji to znamená nahrazení $VARIABLE konstrukt (nebo ${VARIABLE} nebo ${VARIABLE#TEXT} nebo jiné konstrukce) nějakým jiným textem, který je sestaven z hodnoty proměnné. Tento další text je rozšířením proměnné.

Proces expanze probíhá následovně. (Probírám pouze běžný případ, některá nastavení prostředí a rozšíření chování upravují.)

  1. Vezměte hodnotu proměnné, což je řetězec. Pokud proměnná není definována, použijte prázdný řetězec.
  2. Pokud konstrukce obsahuje transformaci, použijte ji. Pokud je například konstrukce ${VARIABLE#TEXT} a hodnota proměnné začíná TEXT , odstraňte TEXT od začátku hodnoty.
  3. Pokud kontext vyžaduje jedno slovo (například v uvozovkách nebo na pravé straně úkolu nebo uvnitř dokumentu zde), zastavte se zde. V opačném případě pokračujte dalšími kroky.
  4. Rozdělit hodnotu do samostatných slov v každé sekvenci mezer. (Proměnná IFS lze změnit na rozdělení na jiné znaky než mezery.) Výsledkem tedy již není řetězec, ale seznam řetězců. Tento seznam může být prázdný, pokud hodnota obsahovala pouze mezery.
  5. Považujte každý prvek seznamu za vzor názvu souboru se zástupným znakem, tj. globe . Pokud se vzor shoduje s některými soubory, je nahrazen seznamem odpovídajících názvů souborů, jinak je ponechán.

Předpokládejme například, že proměnná foo obsahuje a* b* c* a aktuální adresář obsahuje soubory bar , baz a paz . Poté ${foo#??} je rozšířen takto:

  1. Hodnotou proměnné je řetězec o 8 znacích a* b* c* .
  2. #?? znamená odstranit první dva znaky, výsledkem je 6znakový řetězec  b* c* (s počáteční mezerou).
  3. Pokud je rozbalení v kontextu seznamu (tj. nikoli v uvozovkách nebo jiném podobném kontextu), pokračujte.
  4. Rozdělte řetězec na slova oddělená mezerami. Výsledkem bude seznam dvou řetězců:b* a c* .
  5. Řetězec b* , interpretovaný jako vzor, ​​odpovídá dvěma souborům:bar a baz . Řetězec c* neodpovídá žádnému souboru, takže zůstane sám. Výsledkem je seznam tří řetězců:bar , baz , c* .

Například echo ${foo#??} vytiskne bar baz c* (příkaz echo spojí své argumenty mezerou mezi nimi).

Související:Co NEDÁVAT na SSD?

Další podrobnosti viz:

  • Rozšíření parametrů ve standardu POSIX s následným rozdělením polí a rozšířením názvu cesty
  • Rozšíření parametrů shellu v příručce bash, následované rozdělením slov a rozšířením názvu souboru
  • $VAR vs ${VAR} a citovat či necitovat
  • Kdy je nutné dvojité uvozování?

Linux
  1. Formát data a času pro skript nebo proměnnou prostředí Linux

  2. Shell skript změní adresář s proměnnou

  3. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  1. Jak nastavit proměnnou $PATH v Linuxu

  2. Které shelly nepodporují expanzi dolarových závorek a poptávkové backticks?

  3. Rozdíl mezi '{}' a {} v příkazu find?

  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Ukládání výstupu příkazu do proměnné Shell?

  3. Jak získat vlastní IP adresu a uložit ji do proměnné ve skriptu Shell?