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!
Tartalomjegyzék
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
Használjuk az összes változónkat egyszerre:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
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
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"
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
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.
Í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.
Í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
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.
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"
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.