Hogyan dolgozzunk változókkal a Bashban

A változók létfontosságúak, ha szkripteket szeretne írni, és megérteni, hogy a webről kivágni és beilleszteni kívánt kód mit fog tenni a Linux számítógépén. Mi elindítjuk!

Változók 101

A változók elnevezett szimbólumok, amelyek karakterláncot vagy numerikus értéket képviselnek. Ha parancsokban és kifejezésekben használja őket, akkor a rendszer úgy kezeli őket, mintha a változó neve helyett a bennük lévő értéket írta volna be.

Változó létrehozásához csak egy nevet és értéket adjon meg neki. A változók nevének leíró jellegűnek kell lennie, és emlékeztetnie kell a bennük lévő értékre. A változó neve nem kezdődhet számmal, és nem tartalmazhat szóközt. Kezdődhet azonban egy aláhúzással. Ezen kívül a kis- és nagybetűs alfanumerikus karakterek bármilyen keverékét használhatja.

Példák

Itt öt változót hozunk létre. A formátum a név, az egyenlőségjel = és az érték beírása. Vegye figyelembe, hogy az egyenlőségjel előtt vagy után nincs szóköz. Egy változó értékének megadását gyakran úgy nevezik, mint érték hozzárendelését a változóhoz.

Létrehozunk négy karakterlánc-változót és egy numerikus változót, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Nak nek lásd az értéket változóban van, használja az echo parancsot. A változó nevét egy $ dollárjellel kell megelőzni, amikor hivatkozik a benne lévő értékre, az alábbiak szerint:

echo $my_name
echo $my_boost
echo $this_year

A

Használjuk az összes változónkat egyszerre:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

A

A változók értékei helyettesítik a nevüket. A változók értékeit is módosíthatja. Ha új értéket szeretne rendelni a my_boost változóhoz, csak ismételje meg, amit az első érték hozzárendelésekor tett, például:

my_boost=Tequila

A

Ha újra futtatja az előző parancsot, most más eredményt kap:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

A visszhang

Tehát használhatja ugyanazt a parancsot, amely ugyanazokra a változókra hivatkozik, és eltérő eredményeket kaphat, ha megváltoztatja a változókban tárolt értékeket.

A változók idézéséről később lesz szó. Egyelőre emlékezz néhány dologra:

Az idézőjelben lévő változókat a rendszer literális karakterláncként kezeli, nem pedig változóként.
Az idézőjelben lévő változókat a rendszer változóként kezeli.
Ahhoz, hogy az értéket egy változóban tároljuk, meg kell adni a $ dollárjelet.
A $ dollárjel nélküli változó csak a változó nevét adja meg.

Létrehozhat olyan változót is, amely értékét egy meglévő változóból vagy számos változóból veszi. A következő parancs meghatároz egy új változót drink_of_the_Year néven, és hozzárendeli a my_boost és a this_year változók kombinált értékeit:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Az év itala=

Változók használata szkriptekben

Változók nélkül a szkriptek teljesen összeomlanak. A változók biztosítják azt a rugalmasságot, amely a szkriptet általános, nem pedig konkrét megoldássá teszi. A különbség szemléltetésére itt van egy szkript, amely megszámolja a /dev könyvtárban lévő fájlokat.

  Vezérlőközpont modulok rögzítése a Mac menüsorához

Írja be ezt egy szöveges fájlba, majd mentse el fcnt.sh néven (a „fájlszámhoz”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Mielőtt futtatná a szkriptet, végrehajthatóvá kell tennie az alábbiak szerint:

chmod +x fcnt.sh

A szkript futtatásához írja be a következőket:

./fcnt.sh

Ez kiírja a /dev könyvtárban lévő fájlok számát. Így működik:

Meg van határozva a folder_to_count nevű változó, amely a „/dev” karakterláncot tartalmazza.
Egy másik változó, az úgynevezett file_count, meg van határozva. Ez a változó értékét egy parancshelyettesítésből veszi. Ez a parancs kifejezés a zárójelek között $( ). Ne feledje, hogy az első zárójel előtt egy dollárjel található. Ez a $( ) konstrukció kiértékeli a zárójelben lévő parancsokat, majd visszaadja azok végső értékét. Ebben a példában ez az érték a file_count változóhoz van rendelve. Ami a file_count változót illeti, átadott egy értéket, amelyet megtartani kell; nem az érték megszerzésének módja.
A parancshelyettesítésben kiértékelt parancs egy ls fájllistát hajt végre a folder_to_count változóban lévő könyvtárban, amely „/dev”-re van beállítva. Tehát a szkript végrehajtja az „ls /dev” parancsot.
A parancs kimenete a wc parancsba kerül. A -l (sorszám) opció a wc-t okozza számolja meg a sorok számát az ls parancs kimenetében. Mivel minden fájl külön sorban van felsorolva, ez a fájlok és alkönyvtárak száma a „/dev” könyvtárban. Ez az érték a file_count változóhoz van rendelve.
Az utolsó sor visszhangot használ az eredmény kiadására.

De ez csak a „/dev” könyvtárban működik. Hogyan tudjuk a szkriptet bármilyen könyvtárral működni? Csak egyetlen apró változtatás kell hozzá.

A parancssori paraméterek használata szkriptekben

Sok parancs, például az ls és a wc parancssori paramétereket vesz fel. Ezek információt szolgáltatnak a parancsnak, így tudja, mit akar tenni. Ha azt szeretné, hogy ls dolgozzon a saját könyvtárán és rejtett fájlok megjelenítéséhez is, használhatja a következő parancsot, ahol a tilde ~ és az -a (all) paraméter parancssori paraméterek:

ls ~ -a

Szkriptjeink képesek parancssori paramétereket fogadni. Az első paraméternél $1, a másodiknál ​​$2, és így tovább, egészen a kilencedik paraméternél 9 dollárig. (Valójában van egy 0 dollár is, de ez a forgatókönyv mindig megtartására van fenntartva.)

A parancssori paraméterekre ugyanúgy hivatkozhat egy parancsfájlban, mint a szokásos változókra. Módosítsuk a szkriptünket az alábbiak szerint, és mentsük el az új fcnt2.sh néven:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Ezúttal a folder_to_count változóhoz az első parancssori paraméter, a $1 értéke van hozzárendelve.

A szkript többi része pontosan úgy működik, mint korábban. Konkrét megoldás helyett a szkript most egy általános. Bármilyen könyvtárban használhatja, mert nincs merevkódolva, hogy csak a „/dev”-vel működjön.

  CPU-értékelések dekódolása: Útmutató kezdőknek a processzorkifejezésekhez

Így teheti végrehajthatóvá a szkriptet:

chmod +x fcnt2.sh

Most próbálja ki néhány könyvtárral. Először megteheti a „/dev” parancsot, hogy megbizonyosodjon arról, hogy ugyanazt az eredményt kapja, mint korábban. Írja be a következőket:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Ugyanazt az eredményt kapja (207 fájl), mint korábban a „/dev” könyvtárnál. Ez biztató, és a többi parancssori paraméterhez címtárspecifikus eredményeket kap.

A szkript lerövidítéséhez teljesen mellőzheti a folder_to_count változót, és csak a $1-re hivatkozik, az alábbiak szerint:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Munkavégzés speciális változókkal

Említettük a $0-t, amely mindig a szkript fájlnevére van állítva. Ez lehetővé teszi, hogy a szkriptet olyan műveletekre használja, mint például a nevének helyes kinyomtatása, még akkor is, ha átnevezték. Ez olyan naplózási helyzetekben hasznos, amikor tudni szeretné a bejegyzést hozzáadó folyamat nevét.

Az alábbiak a további speciális előre beállított változók:

$#: Hány parancssori paramétert adtak át a szkriptnek.
[email protected]: A szkriptnek átadott összes parancssori paraméter.
$?: Az utoljára futó folyamat kilépési állapota.
$$: Az aktuális szkript folyamatazonosítója (PID).
$USER: A parancsfájlt végrehajtó felhasználó felhasználóneve.
$HOSTNAME: A szkriptet futtató számítógép gazdagépneve.
$SECONDS: A szkript futásának másodperceinek száma.
$RANDOM: Véletlen számot ad vissza.
$LINENO: A szkript aktuális sorszámát adja vissza.

Mindet egy forgatókönyvben szeretné látni, igaz? Tudsz! Mentse el a következőket speciális.sh nevű szövegfájlként:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Írja be a következőket, hogy végrehajtható legyen:

chmod +x special.sh

Most már futtathatja egy csomó különböző parancssori paraméterrel, az alábbiak szerint.

Környezeti változók

A Bash környezeti változókat használ az indításkor létrehozott környezet tulajdonságainak meghatározására és rögzítésére. Ezek olyan információk, amelyekhez a Bash könnyen hozzáférhet, például az Ön felhasználóneve, területi beállítása, az előzményfájlban tárolható parancsok száma, az alapértelmezett szerkesztő és még sok más.

A Bash-munkamenet aktív környezeti változóinak megtekintéséhez használja ezt a parancsot:

env | less

A

Ha végiggörget a listán, találhat néhányat, amelyekre hasznos lehet hivatkozni a szkriptekben.

A változók exportálása

Amikor egy szkript fut, az a saját folyamatában van, és az általa használt változók nem láthatók a folyamaton kívül. Ha meg szeretne osztani egy változót egy másik szkripttel, amelyet a szkript indít el, exportálnia kell azt a változót. Megmutatjuk, hogyan kell ezt megtenni két szkripttel.

  Hogyan adhatunk embereket és cégeket a névjegyekhez Mac rendszeren

Először mentse el a következőket script_one.sh fájlnévvel:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Ez két változót hoz létre, a first_var és a second_var, és hozzárendel néhány értéket. Kiírja ezeket a terminálablakba, exportálja a változókat, és meghívja a script_two.sh fájlt. Amikor a script_two.sh leáll, és a folyamatfolyam visszatér ehhez a szkripthez, ismét kinyomtatja a változókat a terminálablakba. Aztán láthatod, hogy változtak-e.

A második általunk használt szkript a script_two.sh. Ezt a szkriptet hívja meg a script_one.sh. Írja be a következőket:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Ez a második szkript kiírja a két változó értékét, új értékeket rendel hozzájuk, majd ismét kinyomtatja azokat.

A szkriptek futtatásához a következőket kell begépelnie, hogy végrehajthatóak legyenek:

chmod +x script_one.sh
chmod +x script_two.sh

És most írja be a következőt a script_one.sh elindításához:

./script_one.sh

Ezt mondja a kimenet:

A script_one.sh kiírja a változók értékeit, amelyek az alfa és a bravo.
A script_two.sh kiírja a változók (alpha és bravo) értékeit, ahogy azokat megkapta.
A script_two.sh ezeket charlie-ra és delta-ra változtatja.
A script_one.sh kiírja a változók értékeit, amelyek továbbra is alfa és bravo.

Ami a második szkriptben történik, az a második szkriptben is marad. Ez olyan, mintha a változók másolatait elküldené a második szkriptnek, de a program elveti, amikor a szkript kilép. Az első szkriptben szereplő eredeti változókat semmi sem módosítja, ami a második szkriptben a másolataikkal történik.

Hogyan idézzünk változókat

Talán észrevette, hogy amikor a szkriptek változókra hivatkoznak, azok idézőjelben vannak. Ez lehetővé teszi a változókra való helyes hivatkozást, így azok értékeit használja a program, amikor a sor végrehajtódik a szkriptben.

Ha a változóhoz rendelt érték szóközöket tartalmaz, akkor azoknak idézőjelben kell lenniük, amikor hozzárendeli őket a változóhoz. Ennek az az oka, hogy alapértelmezés szerint a Bash szóközt használ elválasztóként.

Íme egy példa:

site_name=How-To Geek

Bash a „Geek” előtti szóközt jelzi, hogy új parancs indul. Azt jelenti, hogy nincs ilyen parancs, és elhagyja a sort. Az echo azt mutatja, hogy a site_name változó nem tartalmaz semmit – még a „How-To” szöveget sem.

Próbálja újra az érték körüli idézőjelekkel, az alábbiak szerint:

site_name="How-To Geek"

site_name=

Ezúttal egyetlen értékként ismeri fel, és megfelelően van hozzárendelve a site_name változóhoz.

echo Is Your Friend

Eltarthat egy ideig, amíg megszokja a parancsok helyettesítését, a változók idézését, és emlékezni kell arra, hogy mikor kell belefoglalni a dollárjelet.

Mielőtt megnyomná az Entert, és végrehajtana egy sor Bash-parancsot, próbálja meg előtte visszhanggal. Így megbizonyosodhat arról, hogy mi fog történni, az az, amit akar. A szintaxisban esetlegesen elkövetett hibákat is elkaphatja.