Bash

A stabil verziót 2022. szeptember 14-én nézték meg . Ellenőrizetlen változtatások vannak a sablonokban vagy a .
GNU Bourne-Again Shell

Tipikus munkamenet a bashban
Típusú UNIX shell
Szerző Brian Fox
Fejlesztő Chet Ramey
Beírva Xi
Operációs rendszer UNIX-szerű
Interfész nyelvek angol , többnyelvű ( gettext )
Első kiadás 1989. június 8
Hardver platform x86_64 [2] és i686 [2]
legújabb verzió
béta verzió 5.2-béta ( 2022. április 13. )
Olvasható fájlformátumok Bash szkript [d]
Engedély GNU általános nyilvános licenc
Weboldal gnu.org/software/bash/
 Médiafájlok a Wikimedia Commons oldalon

A Bash (az angol  B ourne a gain sh ell szóból , szó "Born again" shell - "reborn" shell) a Bourne shell parancshéj  továbbfejlesztett és modernizált változata . Az egyik legnépszerűbb modern UNIX shell . Különösen népszerű Linux környezetben , ahol gyakran használják előre telepített parancshéjként.

Ez egy parancsfeldolgozó, amely általában interaktívan működik szöveges ablakban. A Bash parancsokat is tud olvasni egy script (vagy script ) nevű fájlból . Mint minden Unix shell, támogatja a fájlok és könyvtárak befejezését, a parancskimenetek helyettesítését, a változókat, a végrehajtási sorrend vezérlését, az elágazás és a ciklus utasításait. A kulcsszavakat, a szintaxist és a nyelv egyéb alapvető jellemzőit az sh -ből kölcsönözték . Más funkciók, például a történelem, a csh és a ksh fájlokból lettek másolva . A Bash alapvetően megfelel a POSIX szabványnak , de számos kiterjesztéssel [3] .

A "bash" név az angol nyelv rövidítése . Bourne-again-shell ("egy másik-Bourne-shell"), és játék a szavakkal: A Bourne-shell a UNIX (sh) shell egyik népszerű változata, szerzője Stephen Bourne ( 1978 ), 1987 -ben javítva. írta: Brian Fox . A Bourne vezetéknév (Born) az angol born szót visszhangozza , jelentése "született", innen: born-ain-command shell.  

2014 szeptemberében egy széles körben kihasznált Bashdoor biztonsági rést fedeztek fel a bash -ban .

Szintaktikai különbségek

A fontos Bourne shell szkriptek túlnyomó többsége módosítás nélkül futtatható a bash-ban, kivéve azokat, amelyek Bourne speciális változókra hivatkoznak vagy Bourne beépített modulokat használnak. A Bash parancs szintaxisa a Korn parancsértelmezőből ( ksh ) és a C shellből ( csh ) kölcsönzött ötleteket tartalmaz , mint például a parancssori szerkesztés, a parancselőzmények, a könyvtárverem, a változók $RANDOMés $PPIDa parancshelyettesítő szintaxis $(…). Amikor interaktív shellként használják, a Bash támogatja a programnevek, fájlok, változók stb. automatikus kiegészítését a billentyű használatával Tab ↹.

Belső parancsok

A bash interpreter számos beépített parancsot tartalmaz, amelyek közül néhánynak hasonló futtatható fájljai vannak az operációs rendszerben . Ne feledje azonban, hogy a beépített parancsokhoz leggyakrabban nincsenek kézikönyvoldalak , és amikor megpróbálja megtekinteni egy beépített parancs súgóját, valójában a végrehajtható fájl súgója jelenik meg. A végrehajtható fájl és a beépített parancs paraméterei eltérhetnek. A beépített parancsokkal kapcsolatos információk a bash man oldalon találhatók:

man bash

Bemenet kimenet
echo kifejezést vagy egy változó tartalmát ( stdout ) ad ki, de használatában vannak korlátozások [4]
printf formázott kimeneti parancs, a parancs kiterjesztett verziójaecho
read "beolvassa" egy változó értékét a szabványos bemenetről ( stdin ), interaktívan ez a billentyűzet
Fájlrendszer
cd megváltoztatja az aktuális könyvtárat
pwd megjeleníti az  aktuális munkakönyvtár nevét
pushd megfordítja az aktuális könyvtárat
popd után adja vissza az aktuális könyvtáratpushd
dirs listázza vagy törli a következőn keresztül mentett könyvtárak kötegének tartalmátpushd
Műveletek a változókon
let aritmetikai műveleteket hajt végre a változókon
eval lefordítja az argumentumok listáját egy listából parancsokká
set megváltoztatja a belső szkriptváltozók értékeit
unset változót töröl
export változót exportál, elérhetővé téve a gyermekfolyamatok számára
declare,typeset változók beállítása és/vagy korlátozása
getopts a parancssorból a szkriptnek átadott argumentumok elemzésére szolgál
Forgatókönyv-kezelés
source, .(pont) futtassa a megadott szkriptet
exit a forgatókönyv feltétel nélküli befejezése
exec lecseréli az aktuális folyamatot egy új, a parancs által elindított folyamatraexec
shopt lehetővé teszi a shell billentyűinek (opcióinak) "menet közben" megváltoztatását
Csapatok
true nulla kilépési kódot ad vissza (siker)
false hibajelző kilépési kódot ad vissza
type prog kiírja a prog teljes elérési útját
hash prog emlékszik a progihoz vezető útra
help COMMAND rövid súgót nyomtat a COMMAND belső parancs használatáról
A shellben futó feladatok kezelése
jobs a parancshéjban futó feladatok listáját vagy egy adott feladatra vonatkozó információkat a szám szerint jeleníti meg
fg átkapcsolja a bemeneti adatfolyamot az aktuális feladatra (vagy egy adott feladatra, ha a száma meg van adva), és folytatja a végrehajtást
bg a háttérben folytatja az éppen felfüggesztett feladat (illetve konkrét feladatok, ha azok száma is meg van adva) végrehajtását
wait várja a megadott feladatok befejezését

Szkriptek

A legegyszerűbb esetben a szkript  egy fájlba írt parancsok egyszerű listája. A parancsfeldolgozónak tudnia kell, hogy fel kell dolgoznia ezt a fájlt, nem csak a tartalmát kell olvasnia. Ezt a shebang nevű speciális konstrukció végzi : #!. A szimbólum #egy megjegyzést ad meg, de ebben az esetben a shebang azt jelenti, hogy e speciális szimbólum után van egy út az értelmezőhöz a szkript végrehajtásához.

Szintaxis

A bash parancs szintaxisa egy kiterjesztett Bourne shell parancs szintaxis. A bash parancs végleges szintaktikai specifikációja a GNU Project által terjesztett Bash Reference Manual - ban található . [5]

"Hello world" #!/usr/bin/env bash echo 'Hello World!'

Ez a szkript csak két sort tartalmaz. Az első sor közli a rendszerrel, hogy melyik programot használja a fájl futtatásához. A második sor az egyetlen művelet, amelyet ez a szkript végrehajt, valójában kiírja a "Hello world!" a terminálban.

A szkript futtatása

Egy szkript futtathatóvá tételéhez a következő parancsok használhatók:

chmod +rx szkriptnév # olvasási/végrehajtási engedélyt ad bármely felhasználónak chmod u+rx szkriptnév # olvasási/végrehajtási engedélyt csak a szkript "tulajdonosának" ad

Biztonsági okokból az aktuális könyvtár elérési útja .nem szerepel a környezeti változóban $PATH. Ezért a szkript futtatásához kifejezetten meg kell adnia annak az aktuális könyvtárnak az elérési útját, ahol a szkript található:

./scriptname

Ezenkívül egy ilyen fájlt kifejezetten átadhat a Bash értelmezőnekbash végrehajtásra a következő paranccsal :

bash szkriptnév

Ebben az esetben sem a hozzáférési jogok beállítása, sem a #!kódban szereplő szekvencia használata nem szükséges.

I/O átirányítás

A bash beépített fájlleírókkal rendelkezik : 0 (stdin), 1 (stdout), 2 (stderr).

Az ezekkel és a felhasználó által definiált fogókkal végzett műveletekhez speciális szimbólumok vannak: >(kimenet átirányítás), <(bemenet átirányítás). &A , karakterek -megelőzhetik a leíró számát; például a 2>&1 2. leíró (stderr) átirányítása az 1. leíróra (stdout).

0<filenamevagy<filename Bemenet átirányítása fájlbólfilename
1>filenamevagy>filename A kimenet átirányítása a "fájlnév" fájlba. Ha az opció le van tiltva noclobber, akkor a fájlt felülírja a bejövő adatok
1>|filenamevagy>|filename A kimenet átirányítása a "fájlnév" fájlba, a fájlt felülírja a bejövő adatok
1>>filenamevagy >>filename A kimenet átirányítása a "fájlnév" fájlba, adatok hozzáfűzése a fájl végéhez. Ha a fájl nem létezik, akkor létrejön
2>filename A szabványos hibakimenet átirányítása a "fájlnévre"
2>>filename A szabványos hibakimenet átirányítása a "fájlnév" fájlba, adatok hozzáfűzése a fájl végéhez. Ha a fájl nem létezik, akkor létrejön
&>filename A kimenet és a hibák átirányítása a "fájlnévre"
2>&1 Hibakimenet átirányítása szabványos kimenetre

A Bash egyéni átirányítási szintaxissal rendelkezik, amelyet a Bourne shell nem támogat. Példa a szabványos kimenet és a szabványos hibák egyidejű átirányítására:

parancs & > fájl

Ezt könnyebb begépelni, mint a Bourne shell szintaxisban szereplő megfelelő parancsot.

parancs > fájl 2 > & 1

Átirányítás "a script kódból"

Támogatott heredoc szintaxis :

  • A blokkon belüli változók és nyelvi konstrukciók értelmezésével:
$a = 'többsoros' parancs <<MYDOC123 $a szöveg $(<$HOME/my_file.txt) MYDOC123
  • A változók értelmezése nélkül:
parancs <<'PERLCODE' my $first='Hello'; az én $second='világom'; mondd join(', ',$first,$second),'!'; PERLCODE
  • A kezdeti behúzás eltávolításával (csak a tabulátoros behúzás támogatott):
parancs <<-'TABSTRIP' for ((i=0; i<10; i++)) do echo "$i" kész TABSTRIP

A 2.05b verzió óta a bash át tudja irányítani a szabványos bemenetet egy karakterláncból a következő " here strings " szintaxis használatával:

parancs <<< "standard bemenetként olvasandó karakterlánc"

Ha a karakterlánc szóközt tartalmaz, akkor azt idézőjelekbe vagy aposztrófok közé kell tenni, vagy a szóközöket fordított perjellel meg kell szüntetni.

Legyen óvatos: az itt stringek használatával beírt karakterlánc implicit sorlezáró szekvenciát tartalmaz: vagy 1 extra bájt soremelés , vagy 2 extra bájt: kocsivissza és soremelés.

macska - <<< '123' | wc -c # Eredmény: 4 cat < ( echo -n '123' ) | wc -c # Eredmény: 3 wc -c <<< '123' # Eredmény: 4 echo -n 123 | wc -c # Eredmény: 3

A 4.1-es verziótól kezdődően [6] lehetővé vált egy sorban egy befejező karaktersorozat, majd közvetlenül utána egy zárójel megadása. Ez hasznos lehet egy here-doc tartalomváltozó hozzárendeléséhez:

var = $( cat - <<'TERMSEQ' Február. Szerezz egy kis tintát és sírj! Írj zokogva februárról Míg a dübörgő latyakos feketén ég tavasszal. TERMSEQ )

Ez figyelmeztető üzenetet generál a BASH-ban.

Átirányítás a folyamat egészére

Példa (szabványos kimenet átirányítása fájlba, adatok írása, a fájl bezárása, stdout kiürítése):

# a Filedescriptor(FD) 6 készítése az stdout (FD 1) exec másolataként 6 > & 1 # " test.data " fájl megnyitása az exec 1 írásához >test.data # tartalom előállítása fájl "test.data" exec 1 > & - # az stdout készítése az FD 6 másolatává (reset stdout) exec 1 > & 6 # bezárja az FD6 exec 6 > & -

Fájlok megnyitása és bezárása:

# test.data fájl megnyitása exec 6 olvasásához <test.data # olvasás a fájl végéig olvasás közben -u 6 dta do echo " $dta " kész # test.data exec 6 fájl bezárása < & -

Parancskimenet helyettesítése

Külső parancsok kimenetének rögzítése:

# hajtsa végre a 'date' parancsot, és írja be az eredményt a VAR VAR -ba = " $( date ) " echo " $VAR " #kiírja a dátumot az előző sor meghívásakor

A nullkarakteres karakterláncok nem támogatottak, a záró sorok elvesznek, ellentétben a csövekkel és más fájl I/O -val .

Feltételes operátor

#!/usr/bin/env bash T1 = 'foo' T2 = 'sáv' if [[ $T1 == " $T2 " ]] then echo 'feltétel teljesült' else echo 'feltétel nem sikerült' fi

Vegye figyelembe, hogy a bal oldalon lévő idézőjelek nem kötelezőek. [7]

Ciklusok

#!/usr/bin/env bash for i in "Number" { 1 ..10 } do echo " $i " kész #!/usr/bin/env bash SZÁMLÁLÓ = 0 míg [[ $COUNTER -lt 10 ]] # Amíg a feltétel IGAZ (0-t ad vissza) hajtsa végre a ciklus törzsét csináld echo A számláló $COUNTER legyen SZÁMLÁLÓ = SZÁMLÁLÓ+1 Kész #!/usr/bin/env bash i = 0 , amíg [[ $i -eq 10 ]] # A ciklustörzs végrehajtása addig, amíg a feltétel HAMIS (nem 0-t ad vissza) do echo " $i " i = $(( $ i + 1 )) kész #!/usr/bin/env bash # dupla zárójelben, a változók C-stílusban írhatók ($ és szóközzel elválasztott operátorok és operandusok nélkül) az (( i = 0 ; i < 10 ; i++ )) do echo - n " $i ; " kész

Tömbök

A Bash csak egydimenziós tömböket valósít meg. Az indexek lehetnek egész számok ("reguláris" tömb ) vagy karakterláncok ( " asszociatív tömb " vagy "hash").

A közönséges és asszociatív tömbökkel való munka szintaxisának egységesítése ellenére az előbbiek nem az utóbbi változatai, sem a végfelhasználó szempontjából, sem magának az értelmezőnek a belső logikája szempontjából.

A bash „asszociatív” kulcsok támogatásának természetes következménye, hogy nagyon korlátozott a többdimenziós tömbök emulálása.

Általános műveletek

Szerezzen egy karakterláncot, amely egy tömb összes [8] eleméből áll, szóközzel elválasztva.

értékek = " ${ arr [@] } "

Szerezzen be egy karakterláncot egy tömb mind a [8] indexével vagy kulcsával, függetlenül attól, hogy numerikusak vagy szövegesek:

keys = " ${ !arr[@] } "

Tömegesen cserélje le a "MAY" részkarakterlánc első előfordulását a "MARCH"-ra a tömb összes [8] elemében, és ad vissza egy karakterláncot, amely a tömb eredményül kapott elemeiből áll, szóközzel elválasztva:

Values ​​​​= " ${ arr [@]/MÁJUS/MÁRCIUS } "

Ugyanaz, de a tömb minden [8] elemében a "MAY" részstring minden előfordulása lecserélődik:

Values ​​​​= " ${ arr [@]//MÁJUS/MÁRCIUS } "

Eddig nem minden, a dokumentációban deklarált lehetőség működik megfelelően a tömbök esetében. Például:

[ -v 'tömb_neve' ]

nem működik megfelelően üres tömb esetén. [9]

Műveletek indexelt tömbökön

A Bash támogatja az egydimenziós tömböket. A tömbelemek a következő formában inicializálhatók: my_array[xx]. Egy tömböt kifejezetten deklarálhat egy szkriptben a következő direktíva használatával declare:

deklarál -a my_array

Egy tömb egyes elemei kapcsos zárójelekkel érhetők el: "${my_array[xx]}".

Az indexelt tömb inicializálásának két módja van:

egy)

Tömb =( elem1 elem2 elem3 )

2)

temp_array [ 0 ]= elem1 temp_array [ 5 ]= elem temp_array [ 9 ]= elemN

Elemek hozzáadása egy indexelt tömb végéhez:

deklarál -a arrAnimals arrAnimals =( kutya elefánt ló tehén róka koala teknős ) # A tömb tartalmának megjelenítése: echo " ${ arrAnimals [@] } " # Adjon hozzá egy új elemet az arrAnimals tömb végéhez: "pig" arrAnimals +=( pig ) # És mutasd meg újra a tömb tartalmát: echo " ${ arrAnimals [@] } "

Szerezze meg egy tömb első elemét:

echo " ${ arrAnimals [0] } "

Mind az indexelt, mind az asszociatív tömbök támogatják az úgynevezett "szeletelést":

# Egy másik módszer egy tömb első elemének echo " ${ arrAnimals [@]: 0 : 1 } " lekérésére # Nyomtasson ki 3 tömbelemet a másodiktól kezdve: echo " ${ arrAnimals [@]: 2 : 3 } "

Megjegyzés: asszociatív tömbök esetén az értékek sorrendje általános esetben véletlenszerű lesz (a használt hash függvény határozza meg), így az asszociatív tömbön végzett szeletművelet, bár elfogadható, rendkívül korlátozott hatókörrel rendelkezik. praktikus alkalmazás.

A numerikus indexű tömbökben megengedett a "fordított" ("negatív") címzés, amely lehetővé teszi az elemek elérését a tömb végétől kezdve:

# A tömb utolsó elemének értéke echo " ${ arrAnimals [-1] } " # A tömb utolsó előtti elemének értéke echo " ${ arrAnimals [-2] } " # ... és így tovább.

A beépített paranccsal mapfile(szinonimája: readarray) megjelenítheti egy szöveges fájl tartalmát egy indexelt tömbben:

deklarál -a fileWithLogins mapfile fileWithLogins </etc/passwd for (( i = 0 ; i< ${# fileWithLogins [@] } ; i++ )) do echo "Line # $i : ${ fileWithLogins [ $i ] } " kész Asszociatív tömbműveletek

A 4.0-s verziótól kezdve a bash bevezette az asszociatív tömbök (úgynevezett hash tömbök) támogatását.

Az asszociatív tömbök deklarálása a -Abeépített parancskulcs segítségével történik declare:

deklarálja -A hshArray

Az indexelt tömbökhöz hasonlóan két különböző szintaxis használható az asszociatív tömbök feltöltésére:

egy)

TheCapitalOf [ Georgia ]= 'Tbilisi' TheCapitalOf [ Australia ]= 'Canberra' TheCapitalOf [ Pakisztán ]= 'Iszlámábád'

2)

TheCapitalOf =([ Grúzia ]= 'Tbiliszi' [ Ausztrália ]= 'Canberra' [ Pakisztán ]= 'Iszlámábád' )

Az asszociatív tömbök utánozhatják a többdimenziós tömbök támogatását:

deklarál -A a # egy asszociatív tömböt deklarál 'a' i = 1 ; j = 2 # több index inicializálása a [ $i , $j ]= 5 # "5" értéket rendel a "$i,$j" cellához (azaz "1,2") echo ${ a [ $i , $j ] } # tárolt érték nyomtatása innen: "$i,$j"

Sajnos a bash jelenlegi verzióiban nem lehet egyszerű hozzárendeléssel átmásolni egy asszociatív tömb tartalmát egy másikba. Ez a probléma csak megkerülhető, amelyre két alapvetően eltérő megközelítés létezik:

1) Emulálja a második hash deklarációját a semmiből úgy, hogy lemásolja az első hash deklarációját:

deklarálja -A hsh1 hsh1 =( ... ) forrás < ( deklaráció -p hsh1 | sed 's/^ declare -A hsh1/declare -A hsh2/' )

2) Végezze el a forráskivonat összes [8] elemét, és másolja át őket a célkivonatba:

deklarál -A hsh1 hsh2 hsh1 =( ... ) for k in " ${ !hsh1[@] } " do hsh2 [ " $k " ]= " ${ hsh1 [ " $k " ] } " kész Biztonságos munkavégzés a tömbökkel

A tömbök kényelmes módja annak, hogy dinamikusan generált argumentumokat adjunk át függvényeknek vagy parancsoknak. Ebben az esetben a tömb minden eleme külön argumentum.

args =( ls -l -a / ) ls " ${ args [@] } " # ls -l -a / ls ${ args [@] } # ls -l -a / ls ${ args [*] } # ls -l -a /

A tömbök ilyen módon történő használatakor azonban óvatosnak kell lenni a tömbök bővítésének sajátosságai miatt speciális karakterek @és indexek használatakor *.

Ha a tömböt idézőjelek közé zárjuk, és az index segítségével bővítjük @, akkor szósor jön létre, ahol minden szó külön eleme a tömbnek. Ha azonban nem teszed idézőjelek közé a tömbbővítést, egészen más eredményt kaphatsz: a tömbelemek részét képező szóközök szóelválasztókká válnak.

args =( -l -a '/home/user/Desktop' ) ls " ${ args [@] } " # a '/home/user/Desktop' könyvtár tartalmának megtekintése ls ${ args [@] } # hiba : a '/home/user/Desktop' és a './desk' könyvtár nem létezik

A dupla idézőjelbe zárt indexű tömb *egyetlen sorba bővül, és a tömb összes elemét összefűzi a változóban tárolt határolókkal IFS. Ha nem ad meg dupla idézőjeleket, akkor a tömb ugyanúgy bővül, mint az index használatakor @.

args =( '' usr local bin ) IFS = '/' ls " ${ args [*] } " # a '/usr/local/bin' könyvtár tartalmának megtekintése IFS = '/' ls ${ args [*] } # egyenként felsorolja a '.', './usr', './local' és './bin' könyvtárak tartalmát

Amikor egy szöveges változó tartalmából tömböt hoz létre, figyelembe kell vennie a szóközök lehetséges jelenlétét a szövegben. Például a felsorolást tartalmazó karakterláncból tömb létrehozásának egyik módjaként megfontolhatja a határoló karakter szóközzel való helyettesítését. A terek jelenléte a megosztott elemekben azonban maguknak az elemeknek a részekre való széttöredezéséhez vezet.

array =( ${ text //,/ } ) # hibás: a szöveg a 'text' változóban szóköz karaktereket tartalmazhat IFS = ',' array =( $text ) # helyes: a határoló vessző. IFS = ',' read -r -a tömb <<< " $text " # helyes (a 'text' változó tartalmának átirányítása a 'read' parancsra)

A parancsok kimeneteként kapott szövegből vagy fájlból tömb létrehozása hibákhoz vezethet, mivel nem csak az újsorok, hanem a tabulátorral ellátott szóközök is alapértelmezés szerint elválasztójelnek számítanak [10] .

array =( " $( ls ) " ) # rossz: a fájlnevekben lévő szóközök két tömbelemre oszthatják a fájlnevet IFS = $'\n' array =( " $( ls ) " ) # helyes: csak a sorfordítások lesznek a határolók mapfile -t array < < ( ls ) # helyes: alternatíva a beépített mapfile parancson keresztül

Szállítószalag

A folyamat az előző parancs kimenetét adja át a következő parancs bemenetének, vagy a shell bemenetének. A módszert gyakran használják parancsok sorozatának egyetlen láncba kapcsolására. A szállítószalagot a csőszimbólum jelzi | .

Példa ( a grep szűrőként működik az stdout-on):

macska fájlnév | grep minta

Logikai műveletek

A logikai VAGY jelölése ||. Feltételes műveleteknél az operátor ||0-t (sikeres) ad vissza, ha az egyik operandus igaz.

A logikai ÉS jelölése &&. A feltételes utasításokban az operátor &&akkor és csak akkor ad vissza 0-t (siker), ha mindkét operandus igaz.

Megjegyzés: A megértésben zavart okozhat az a tény, hogy a parancs true (és bármely parancs sikeres végrehajtása) 0 visszatérési kóddal végződik , siker ( false, ellenkezőleg, nem 0), míg az igaz/hamis logikai érték nem -nulla/ egyenlő nullával.

Példák:

ha hamis ; majd visszhangzik "sikeresen" ; else echo "sikertelenül" ; fi sikertelenül legyen "a=(( 1 && 0 && 123))" ; echo $? ; echo $a 1 # Parancslezáró kód (egy aritmetikai kifejezés kiértékelésének nulla eredménye) 0 # Az "a" változó értéke, egy logikai művelet eredménye if (( 1 && 0 && 123 )) ; akkor visszhangozza az "igaz" ; else echo "hamis" ; fi hamis legyen "a=(( 1 && 123 && -345 ))" ; echo $? ; echo $a 0 # Parancs kilépési kódja 1 # Az "a" változó értéke, logikai művelet eredménye if (( 1 && 123 && -345 )) ; akkor visszhangozza az "igaz" ; else echo "hamis" ; fi igaz false && echo "Siker" || echo "Failed" Sikertelen befejezés

Integer matematika

A Bash egész számokat tud végezni egy folyamaton belül a parancs és a [11]((…)) változó szintaxisával , az alábbiak szerint: $((…))

VAR = 55 # Állítsa a VAR-t 55-re (( VAR = VAR + 1 )) # Adjon hozzá egyet a VAR-hoz. Figyeljük meg a '$' jel hiányát (( VAR += 1 )) # A növekmény rövidítése (( ++VAR )) # Egy másik módja a VAR eggyel növelésének. Előtagnövelést hajt végre (( VAR++ )) # Egy másik módja a VAR eggyel növelésének. Végrehajt egy postfix növekményes visszhangot $(( VAR * 22 )) # Szorozza meg a VAR-t 22-vel, és adja át az eredményt az echo parancsnak $ [ VAR * 22 ] # Ugyanezt csinálja örökölt módszerrel (( VAR <<3)) # Balra eltolás bitenként (ugyanaz, mint a VAR*8) ((VAR>>3 )) # Biteltolás jobbra (ugyanaz, mint a VAR/8)

A parancs ((…))feltételes utasításokban is használható, mivel a kezdeti paramétere 0 vagy 1, ami igaz vagy hamisként értelmezhető:

if (( VAR == Y * 3 + X * 2 )) , akkor echo Igen fi (( Z > 23 )) && echo Igen

A parancs ((…))a következő összehasonlító operátorokat támogatja: == != > < >= <=.

A Bash nem támogatja a folyamat közbeni számításokat lebegőpontos számokkal. Csak a Unix Korn shell ( 1993 -as verzió ) és a zsh (4.0-s verzió óta) támogatja ezt a funkciót.

Matematikai műveletek listája: +, -, *, /, **(hatványozás), %(modulo osztás, osztás maradéka), let - lehetővé teszi az aritmetikai parancsok rövidítéseinek használatát (a felhasznált változók számának csökkentése; például: a += bekvivalens a = a + b, stb.).

Változók és argumentumok

Érvek:

$$ az aktuális shell pid (maga a szkriptfolyamat)
$! az utolsó folyamat pid-je a háttérben
$? az utolsó folyamat visszatérési kódja (függvény vagy szkript)
$x ahol x  a szkriptnek átadott paraméter száma ( $1stb $2. $0 a szkript utolsó futtatása)
$# parancssori argumentumok száma
$* mind a [8] argumentum egyetlen karakterláncként (szó)
$@ ugyanaz, mint $*, de minden [8] paraméter külön sorként (szóként) jelenik meg
$- a szkriptnek átadott zászlók listája
$_ az előző parancs utolsó argumentumát tartalmazza

Beépített változók:

$BASH a bash végrehajtható fájl elérési útja
$BASHPID Az aktuális bash * PID-je (lásd a megjegyzést)
$BASH_VERSINFO[n] 6 elemből álló tömb, amely bash verzióinformációkat tartalmaz
$BASH_VERSION a rendszerre telepített Bash verziója
$DIRSTACK a könyvtárverem tetejének tartalma
$EDITOR alapértelmezett szerkesztő
$EUID "hatékony" felhasználói azonosító szám (Effective User ID)
$FUNCNAME aktuális függvénynév
$GLOBIGNORE a helyettesítő karakterek listája, amelyeket figyelmen kívül hagy a fájlnév-csere (globbing) végrehajtásakor
$GROUPS csoportok, amelyekhez az aktuális felhasználó tartozik
$HOME felhasználói kezdőkönyvtár
$HOSTNAME hálózati gazdagépnév
$HOSTTYPE gép típusa (a hardver architektúrát azonosítja)
$IFS mezőelválasztót a beviteli karakterláncban
$LC_COLLATE beállítja a karakterek rendezési sorrendjét, a fájlnevek helyettesítési műveleteiben és a helyettesítő karakteres keresésekben
$LC_CTYPE karakterkódolást határoz meg
$LINENO A végrehajtható szkript sorszáma
$MACHTYPE hardver architektúra
$OLDPWD régi munkakönyvtár
$OSTYPE operációs rendszer típusa
$PATH keresési útvonal (beleértve a címtárakat /usr/bin/, /usr/X11R6/bin/, /usr/local/binstb.)
$PIPESTATUS Csatorna (csővezeték) visszatérési kódja
$PPID A szülőfolyamat PID (azonosítója).
$PS1 parancssori prompt
$PS2 másodlagos parancssori prompt, akkor jelenik meg, ha további bevitelt várnak a felhasználótól. Általában ">"
$PS3 harmadlagos prompt, akkor jelenik meg, amikor a felhasználónak választania kell egy nyilatkozatbanselect
$PS4 4. szintű prompt, kinyomtatva (módosítva) a hibakeresési kimenet minden sorának elején, amikor a parancsfájlt a -x. Általában „+”, „++” stb.
$PWD működő (aktuális) címtár
$REPLY az alapértelmezett változó, ahová a felhasználó parancsból származó bemenete íródikread
$SECONDS szkript futási ideje (másodpercben)
$SHELLOPTS érvényes tolmács opciók listája (csak olvasható)
$SHLVL héj fészkelő szintje
  • Megjegyzés: bizonyos körülmények között eltér a $$-tól, például olyan alhéjak esetében, amelyek nem igénylik a bash újrainicializálását.

Példa:

$ echo $(visszhang $BASHPID $$) $$ $BASHPID 25680 16920 16920 16920 # | | | | # | | | -- $BASHPID az alhéjon kívül # | | -- $$ az alhéjon kívül # | -- $$ az alhéjon belül # -- $BASHPID az alhéjon belül


Reguláris kifejezések egy folyamaton belül

A Bash 3.0 támogatja a beépített reguláris kifejezéseket , amelyek szintaxisa hasonló a Perléhez :

[[ string = ~regex ]]

A reguláris kifejezések szintaxisa a man 7 regex dokumentációs oldalain található. A kilépési állapot 0, ha a reguláris kifejezés megegyezik a karakterlánccal, és 1, ha nem. A zárójelbe tett részkifejezés értéke [8] egy változón keresztül kapható ${BASH_REMATCH[@]}meg, például:

REGEXP = 'foo(bar)bl(.*)' if [[ "abcfoobarbletch" = ~ $REGEXP ]] then echo "Regex matched string!" echo " $BASH_REMATCH " # nyomatok: foobarbletch echo " ${ BASH_REMATCH [1] } " # nyomatok: bar echo " ${ BASH_REMATCH [2] } " # nyomatok: etch fi

A beépített reguláris kifejezések általában gyorsabbak, mint egy külső grep parancs végrehajtása, mivel a megfelelő reguláris kifejezés a bash folyamaton belül kerül végrehajtásra. Ha a reguláris kifejezés vagy karakterlánc szóközöket vagy metakaraktereket (például *vagy ?) tartalmaz, akkor azokat idézőjelek közé kell tenni. Javasoljuk, hogy a fenti példához hasonlóan változót használjon a reguláris kifejezés megtartásához, hogy elkerülje a speciális karakterek kihagyásával kapcsolatos problémákat. Használhatja a bash kimenetet egy opcióval -xannak ellenőrzésére, hogy a bash hogyan elemzi a reguláris kifejezést.

Konzol bővítése

A kapcsos zárójel bővítő funkciót a csh -ból kölcsönözték . Lehetővé teszi tetszőleges karakterlánc létrehozását hasonló technikával, mint a fájlneveknél. A bash-ban azonban a generált karakterláncoknak nem kell fájlneveknek lenniük. Az egyes karakterlánc-bővítések eredménye nincs rendezve, a sorrend balról jobbra haladva megmarad:

# Ez a bash echo jellemzője a { p,c,d,b } e # ape ace ade abe

Ne használja ezt a funkciót, ha a szkriptet át kell vinni, mert a hagyományos szkriptekben a karakterlánc-bővítés nem működik:

# A hagyományos shell nem adja ugyanazt az eredményt echo a { p,c,d,b } e # a{p,c,d,b}e

Ha a zárójel-bővítést helyettesítő karakterekkel együtt használja, először a zárójeleket bontja ki, majd az eredményt a szokásos módon dolgozza fel. Így az aktuális könyvtárban található JPEG és PNG képek listája a következőképpen érhető el:

ls*. { jpg,jpeg,png } # szögletes zárójelek *.jpg *.jpeg *.png formátumra bővülnek, ami után helyettesítő karakteres keresés történik

Gyorsbillentyűk

  • Tab ↹: A kurzor mögötti sor automatikus kiegészítése .
  • Ctrl++ ! Ctrl: !Ismételje meg az utolsó parancsot.
  • Ctrl+ a: A kurzort a sor elejére mozgatja (egyenértékű a billentyűvel Home).
  • Ctrl+ b: Egy karakterrel visszamozgatja a kurzort (egyenértékű a billentyűvel ←).
  • Ctrl+ r: Keresés korábban begépelt parancsok alapján.
  • Ctrl+ : SIGINTc jelet küld az aktuális jobnak, amely általában (de nem mindig) leállítja és bezárja.
  • Ctrl+ : EOFd jelölőt küld, amely (kivéve, ha egy opció letiltja és az aktuális sor nem tartalmaz szöveget) bezárja az aktuális shellt (egyenértékű a kilépési paranccsal ), amikor a végrehajtó programba lép, befejezi a bevitelt, ha nincs szöveg a sorban , egyébként sorzáró nélkül fejezi be a sort.
  • Ctrl+ d: Törli az aktuális karaktert (csak ha az aktuális sorban van szöveg) (egyenértékű a billentyűvel Delete).
  • Ctrl+ e: A kurzort a sor végére mozgatja (egyenértékű a billentyűvel End).
  • Ctrl+ f: Egy karakterrel előre mozgatja a kurzort (egyenértékű a billentyűvel →).
  • Ctrl+ h: Törli az előző karaktert (ugyanaz, mint a billentyű ← Backspace).
  • Ctrl+ i: Egyenértékű a gombbal Tab ↹.
  • Ctrl+ j: Egyenértékű a gombbal ↵ Enter.
  • Ctrl+ k: Törli a kurzor utáni sor tartalmát, és a bash példány vágólapjára másolja (kill ring).
  • Ctrl+ l: Törli a képernyő tartalmát (egyenértékű a paranccsal clear).
  • Ctrl+ m: Egyenértékű a gombbal ↵ Enter.
  • Ctrl+ n: (next) a következő parancsra görget (egyenértékű a billentyűvel ↓).
  • Ctrl+ o: Végrehajtja a talált parancsot az előzményekben, és kiválasztja az előzmények aktuális sorához viszonyított következő sort szerkesztésre.
  • Ctrl+ p: (előző) az előző parancsra görget (egyenértékű a billentyűvel ↑).
  • Ctrl+ q: Folytassa a folyamat kimenetét.
  • Ctrl+ s: A folyamat kimenetének felfüggesztése (leállítás).
  • Ctrl+ t: A szomszédos karakterek felcserélése.
  • Ctrl+ u: Törli a sor tartalmát a kurzorig, és a bash példány vágólapjára másolja (kill ring).
  • Ctrl+ w: Eltávolítja a szót a kurzorig, és a bash példány vágólapjára másolja (kill ring).
  • Ctrl+ : A kurzor pozíciójából hozzáadja a bash példány vágólapjánaky tartalmát .
  • Ctrl+ z: SIGTSTP jelet küld az aktuális jobnak, amely felfüggeszti annak végrehajtását és folytatja a parancsok fogadását. A végrehajtás a háttérben folytatásához kiadhatja a bg parancsot. A háttérből való visszaállításhoz vagy felfüggesztéshez futtassa az fg-t.
  • Ctrl+ /: Az aktuális folyamat befejezése magkiíratással annak jelzésével.
  • Ctrl+ _( Ctrl+ ⇧ Shift+ -): Szerkesztés visszavonása.
  • Alt+ >: Ugrás az előzmények utolsó parancsára.
  • Alt+ b: (hátra) egy szóval visszamozgatja a kurzort (egyenértékű a Ctrl+ gombbal ←).
  • Alt+ d: Lerövidíti a kurzor utáni szót.
  • Alt+ f: (előre) egy szóval előre mozgatja a kurzort (egyenértékű a Ctrl+ gombbal →).
  • Alt+ t: Felcseréli a kurzor előtti két szót.
  • Alt+ .: Hozzáadja az utolsó argumentumot az előző parancshoz.
  • Alt+ c: Változtassa a kurzor alatti betűt nagyra.
  • Alt+ l: Módosítsa a kurzor alatti betűt kisbetűre.
  • Ctrl++ x Ctrl: xA kurzort az aktuális pozícióból a sor elejére mozgatja, majd vissza.
  • Ctrl++ x Ctrl: eSzerkeszti az aktuális sort a $EDITOR programban, vagy vi, ha nincs előre definiálva.
  • Ctrl++ x Ctrl: vAz aktuális bash példány verzióinformációinak megjelenítése.

Indítsa el a szkripteket

A Bash indításkor számos különböző szkriptből hív meg parancsokat.

Amikor a bash-t interaktív bejelentkezési shellként hívják meg , az első dolga az, hogy beolvassa és végrehajtja a parancsokat egy fájlból /etc/profile, ha ez a fájl létezik. A fájl elolvasása után a következő fájlokat nézi meg a következő sorrendben: ~/.bash_profile, ~/.bash_loginés ~/.profile, az első létező és olvasható parancsokat olvassa be és hívja meg. Kilépéskor a bash beolvassa és végrehajtja a parancsokat a ~/.bash_logout.

Amikor egy interaktív shell elindul, de nem bejelentkezéshez, a bash beolvassa és végrehajtja a parancsokat a fájlokból /etc/bash.bashrc, és ~/.bashrcha léteznek. Ez az opcióval felülírható -norc. Az opció -rcfile filearra kényszeríti a bash-t, hogy a fájlból származó parancsokat használja a és filehelyett . /etc/bash.bashrc~/.bashrc

Hordozhatóság

A szkript első sorának egy bejegyzésnek kell lennie, #!/bin/bashha ismert a végrehajtható fájl abszolút elérési útja, vagy #!/usr/bin/env bashautomatikusan meghatározza a végrehajtható fájl elérési útját az env paranccsal a PATH környezeti változó használatával [12] .

A bash-specifikus tulajdonságokkal írt shell-szkriptek nem működnek a Bourne shell-t (sh) vagy annak megfelelőjét használó rendszereken, kivéve, ha a bash-t további shellként telepítették. Ez a probléma különösen fontossá vált, amikor 2006 októberében az Ubuntu elkezdte a Debian Almquist parancsértelmezőt (dash) szállítani alapértelmezett parancsfájlhéjként, ami számos szkript meghibásodását okozta.

Grafikus felület a szkriptekhez

Sok olyan program létezik, amely lehetővé teszi grafikus felület létrehozását a bash szkriptekhez.

  • A dialógus  egy segédprogram, amely lehetővé teszi párbeszédpanelek létrehozását a konzolon a curses és ncurses könyvtárak használatával .
  • A whiptail  a dialógus segédprogram analógja, a newt könyvtárat használja .
  • A zenity  a legnépszerűbb grafikus felhasználói felület a szkriptek készítésére.
  • A kdialog  a zenity analógja a KDE környezetben .
  • A yad  a zenity villája, több funkcióval.
  • Az xdialog  a párbeszédpanel helyettesítője, amelyet arra terveztek, hogy a terminál által indított programok számára az X Window System felületét adja .
  • A gtkdialog  a legfunkcionálisabb segédprogram grafikus alkalmazások létrehozásához bash szkriptekben.

Lásd még

Jegyzetek

  1. Ramey C. Bash-5.2 kiadás  (angolul) – 2022.
  2. 1 2 GNU Guix – 2012.
  3. William McCarty. Debian GNU/Linux tanulása .  13. A BASH Shell meghódítása . O'Reilly Media (1999. október 6.) . Letöltve: 2018. december 6. Az eredetiből archiválva : 2017. november 9..
  4. Nem jeleníthető meg egy olyan változó értéke, amely tartalmazza -n(ellentétben a printf -- '%s\n' "${переменная}") értékkel, mert -na rendszer parancsparaméterként értelmezi echo.
  5. Bash Reference Manual archiválva : 2019. május 13. a Wayback Machine -nél .
  6. Bash News . Hozzáférés időpontja: 2017. január 18. Az eredetiből archiválva : 2017. február 1..
  7. BashGuide/TestsAndConditionals archiválva : 2014. február 12., a Wayback Machine  - Greg's Wiki webhelyen.
  8. 1 2 3 4 5 6 7 8 Az összes elem lekéréséhez idézőjeleket kell használni, beleértve a szóközökből és üres karakterláncokból származó elemeket is.
  9. Itt az aposztrófokat helyesen használjuk.
  10. ↑ bash(1) : GNU Bourne-Again SHell - Linux kézikönyvoldal  . linux.die.net. Letöltve: 2017. július 11. Az eredetiből archiválva : 2019. december 27.
  11. Elavult verzió: $[…].
  12. env(1) - Linux kézikönyv oldal . man7.org. Letöltve: 2017. január 21. Az eredetiből archiválva : 2017. január 13.

Linkek