BASH: descrierea buclelor for, while, until și exemple de utilizare. Noțiuni de bază pentru programarea Shell Setarea unei variabile Shell prin ieșirea dintr-o comandă

pentru VAR în 1 2 3...N do Terminat sau într-o singură linie: pentru VAR în 1 2 3...N; do ; Terminat
Este permisă înlocuirea atât a valorilor numerice, cât și a caracterelor ASCII într-o variabilă.
Exemplu: $ pentru i în 1 2 A B Abc ; face eco $i; done 1 2 A B Abc Exemplu de listare în variabilă fișiere prin „mască” pentru transcodarea video: pentru i în*.avi; do ; Terminat

2. Înlocuirea rezultatelor executării unei alte comenzi

pentru VAR în $(); do ; Terminat
Un exemplu de utilizare a rezultatelor comenzii seq: pentru i în$(seq[KEY]); do eco $i; Terminat$ pentru i în $(sev 3); face eco $i; făcut 1 2 3 $ pentru i în $(seq 3 5); face eco $i; făcut 3 4 5 $ pentru i în $(seq 2 2 6); face eco $i; done 2 4 6 Un exemplu de utilizare a rezultatelor comenzii ls: $ for i în $(ls /$HOME/Video); face eco $i; făcut 001.avi 002.avi 003.avi

3. Înlocuire folosind stilul C

pentru((EXPR1; EXPR2; EXPR3)) do <список команд> Terminat pentru((i=1; i<=3 ; i++)); do eco $i; Terminat$ pentru ((i=1; i<=3 ; i++)); do echo $i; done 1 2 3 Подробнее о применении C-style в Bash

4. Enumerarea cu bretele (..)

Sintaxa (START..END) este acceptată începând cu versiunea bash 3.0+, iar din versiunea bash 4.0+ este acceptată sintaxa (START..END..INCREMENT):

pentru VAR în {..} do Terminat sau pentru VAR în {....} do Terminat Exemple: $ pentru i în (1..3); face eco $i; făcut 1 2 3 sau $ pentru i în (4..8..2); face eco $i; done 4 6 8 Numărarea este posibilă atât pentru creșterea cât și pentru decrementarea valorilor: $ pentru i în (6..-4..3); face eco $i; făcut 6 3 0 -3

5. Înlocuirea parametrilor ( în "[email protected]")

Execută comenzi pentru fiecare parametru care a fost transmis scriptului. pentru VAR în [email protected] do Terminat sau într-o singură linie: pentru VAR în [email protected]; do ; Terminat
Deci, dacă creați un script test.sh #!/bin/sh pentru VAR în [email protected] do ecou$var Terminat apoi atunci când îl rulați cu parametrii: $ ./test.sh param1 param2 param3 param1 param2 param3 Part în [email protected] poate fi coborâtă. Apoi scriptul test.sh va fi rescris: #!/bin/sh pentru VAR do ecou$var Terminat
Iată câteva exemple (cu înși fără): $ funcția FUNC_1 (pentru VAR in [email protected]; face eco $VAR; Terminat; ) $ FUNC_1 param1 param2 param3 param1 param2 param3 $ funcția FUNC_2 ( pentru VAR; face eco $VAR; terminat; ) $ FUNC_2 param1 param2 param3 param1 param2 param3

6. Aplicarea continue și break într-o buclă for

Pentru toate construcțiile de mai sus, este posibil să folosiți comenzile „continue” pentru a trece la următorul element al buclei sau „break” pentru a ieși din buclă.

Exemplu (terminați când i=6 și nu executați când i=3 și i=5): pentru i in(1..8); do dacă[ $i -eq 6 ]; apoi pauză; fi dacă[ $i -eq 3 ] || [ $i -eq 5 ]; apoi continua; fi echo $i Terminat Rezultatul execuției: $ $ pentru i în (1..8); face \ > if [ $i -eq 6 ]; apoi rupe; fi; \ > dacă [ $i -eq 3 ] || [ $i -eq 5 ]; apoi continua; fi; \ > echo $i; \> gata 1 2 4

Degtyarev E.K. Shell - un interpret pentru comenzile date de la terminal sau dintr-un fișier batch. Acesta este un program normal (adică nu este inclus în nucleul sistemului de operare UNIX). Poate fi înlocuit cu altul sau poate avea mai multe. Cele mai cunoscute două versiuni sunt: ​​- Shell (versiunea 7 UNIX) sau Bourne Shell (de la numele autorului S. R. Bourne de la Bell Labs); - C-Shell (versiuni de Berkley UNIX). Sunt similare, dar există diferențe: C-Shell este mai puternic în modul de dialog, în timp ce Shell obișnuit are structuri de control mai elegante. Shell este un limbaj de programare, deoarece are: - variabile; - structuri de control (ca dacă); - subrutine (inclusiv fișiere batch); - transfer de parametri; - manipularea întreruperii.

7.2. Fișierul de început al sesiunii (autentificare - fișier)

Indiferent de versiunea Shell la intrare sistem UNIX caută un fișier de pornire a sesiunii cu un nume predefinit pentru a-l executa ca fișier batch; - pentru UNIX versiunea 7 este: .profile; - pentru C-Shell este: .login și/sau .cshrc. Comenzile sunt plasate de obicei în acest fișier: - setarea caracteristicilor terminalului; - notificări precum cine, data; - instalarea directoarelor de căutare comenzi (de obicei: /bin, /usr/bin); - schimbarea indicii de la $ la alt simbol etc.

7.3. Procedura limbajului Shell

Acesta este un fișier batch. Există două moduri de a-l apela pentru execuție: 1. $ sh dothat (unde dothat este un fișier batch); 2. $ chmod 755 dothat (fă-l executabil, adică -rwxr-xr-x) $ dothat. Ar trebui să cunoașteți ordinea de căutare a directoarelor de comenzi (implicit): - curent; - sistem / bin; - sistem /usr/bin. Prin urmare, dacă numele fișierului dumneavoastră batch dublează numele comenzii din directoarele de sistem, acesta din urmă va deveni inaccesibil (cu excepția cazului în care îi introduceți numele complet).

7.4. Variabile Shell

În versiunea Shell 7, o definiție de variabilă conține un nume și o valoare: var = valoare. Acces variabil - după nume cu $ în față: fruct = măr (definiție); echo $fruct (acces); măr (rezultat al ecoului). Deci variabila este un șir. Concatenarea șirurilor este posibilă: $ fruct = măr $ fruct = pin $fruct $ echo $fruct ananas $ fruite = măr $ vin = $(fruct)jack $ echo $vin applejack $ Alte moduri de a seta o valoare variabilă sunt introduse dintr-un fișier sau ieșire dintr-o comandă (a se vedea secțiunea 7.6), precum și atribuirea de valori unei variabile - un parametru al buclei for dintr-o listă de valori specificate în mod explicit sau implicit (a se vedea secțiunea 7.9). O variabilă poate fi: 1) Parte dintr-un nume de fișier complet: $d/filename, unde $d este o variabilă (de exemplu, d = /usr/bin). 2) Parte a comenzii: $ S = "sort + 2n + 1 - 2" (spațiile necesită ghilimele "") $ $S tenis/lpr $ $S baschet/lpr $ $S pingpong/lpr $ Totuși, în interiorul valorii pentru comenzile nu pot fi simboluri |, >,

7.5. Variabile predefinite Shell

Unele dintre ele pot fi doar citite. Cele mai frecvente: HOME - directorul „acasă” al utilizatorului; servește ca argument implicit pentru cd; PATH este un set de directoare în care UNIX caută comenzi; PS1 - indiciu principal (șir) al sistemului (pentru v.7 - $). Schimbarea PS1 (hint) se face de obicei în fișierul de conectare, de exemplu: PS1 = ? sau PS1 = "?" (cu un spațiu, care este mai convenabil). Schimbare PATH: $ echo $PATH - vezi; :/bin:/usr/bin - valoarea PATH; $ cd - „acasă”; $ mkdir bin - director nou; $ echo $HOME - uite; /users/maryann - directorul curent; $ PATH = :$HOME/bin:$PATH - schimba PATH; $ echo $PATH - vezi; :/users/maryann/bin:/bin:/usr/bin - noua valoare PATH.

7.6. Setarea unei variabile Shell cu ieșire dintr-o comandă

Exemplul 1: $ acum = `data` (unde `` sunt ghilimele înapoi) $ echo $acum Duminica 14 februarie 12:00:01 PST 1985 $ Exemplul 2: (obținerea valorii variabilei din fișier): $ meniu = `mâncare pentru pisici` $ echo $menu mere cheddar chardonnay (retururile de cărucior sunt înlocuite cu spații).

7.7. Variabile Shell - Argumente de procedură

Acesta este un tip special de variabilă numită numere. Exemplu: $ dothis struguri mere pere (procedură). Apoi parametrii poziționali (argumentele) acestei comenzi sunt disponibili după nume: $1 = `struguri` $2 = `mere` $3 = `pere` și așa mai departe. până la 9 USD. Cu toate acestea, există o comandă shift care mută numele la restul argumentelor dacă sunt mai mult de 9 (fereastra are 9 lățime). O altă modalitate de a obține toate argumentele (chiar dacă sunt mai mult de 9): $*, care este echivalent cu $1$2 ... Numărul de argumente este atribuit unei alte variabile: $#(sharp). În cele din urmă, numele procedurii este $0; variabila $0 nu este luată în considerare la calcularea $#.

7.8. Declarații structurale

Pe lângă proceduri, Shell are declarații structurate precum „if-else” și „while-do”. Programarea Shell, pe lângă scrierea procedurilor, este folosită pentru: - Testarea algoritmului înainte de a-l codifica în limbaje C sau FORTRAN-77 (fără compilare, legare, încărcare, ușurință de depanare); - predarea principiilor de programare neprogramatori.

7.9. instrucțiunea pentru buclă

Să avem un fișier de lot makelist (procedură) $ cat makelist sort +1 -2 people | tr -d -9 | pr -h Distributie | lpr. Dacă există mai multe fișiere în loc de un singur om, de exemplu: adminpeople, hardpeople, softpeople,..., atunci este necesar să repetați procedura cu fișiere diferite. Acest lucru este posibil cu operatorul for -. Sintaxă: for in do done Cuvintele cheie for, do, done sunt scrise de la începutul rândului. Exemplu (schimbați procedura makelist) pentru dosarîn adminpeople, hardpeople, softpeople fac Sort +1 -2 $file | tr ... | lpr gata. Puteți utiliza metacaracterele Shell într-o listă de valori. Exemplu: pentru fișierul în *oameni (pentru toate numele care se termină în oameni) nu ... gata. Dacă in este omis, atunci lista implicită de valori este lista de argumente ale procedurii care conține bucla, iar dacă bucla nu este în procedură, atunci lista parametrilor liniei de comandă (adică comanda acționează ca procedura). Exemplu: pentru fișierul do ... done Pentru a apela makelist adminpeople hardpeople softpeople, se procedează la fel.

7.10. Declarație condițională if

Folosim nume de variabile reprezentând valorile parametrilor procedurii: sort +1 -2 $1 | tr ... | lpr Exemplu de apel nevalid: makelist (fără parametri) unde $1 este nedefinit. Puteți remedia eroarea verificând numărul de argumente - valoarea variabilei $# folosind instrucțiunea if -. Exemplu: (makelist modificat): if test $# -eq 0 then echo "Trebuie să dați un nume de fișier" exit 1 else sort +1 -2 $1 | tr ... | lpr fi Aici test și ieșire sunt comenzile de testare (vezi Secțiunea 7.11) și de ieșire. Astfel, sintaxa instrucțiunii if este: if ; apoi; Cuvintele cheie if, then, else și fi sunt scrise de la începutul rândului. Executarea cu succes a procedurii înseamnă că returnează valoarea true = 0 (zero) (eșec - valoarea returnată nu este egală cu 0). Instrucțiunea exit 1 setează valoarea de returnare la 1 pentru o execuție eșuată a makelistului și încheie procedura. Dacă sunt posibile imbricate. Căci else if, există o abreviere elif, care prescurtează simultan fi.

7.11. comanda „test”.

Nu face parte din Shell, dar este folosit în cadrul procedurilor Shell. Există trei tipuri de verificări: - evaluarea valorilor numerice; - evaluarea tipului dosarului; - evaluarea rândurilor. Fiecare tip are propriile sale primitive (operații op). Pentru numere, sintaxa este: N op M, unde N, M sunt numere sau variabile numerice; op ia valorile: -eq, -ne, gt, -lt, -ge, -le (cu sensul obisnuit, ca, de exemplu, in FORTRAN). Pentru un fișier, sintaxa este: op filename, unde op ia valorile: -s (fișierul există și nu este gol); -f (fișier, nu director); -d (director de fișiere (director); -w (fișier de scris); -r (fișier de citit) Pentru șiruri de caractere, sintaxa este: S op R, unde S, R sunt șiruri de caractere sau variabile de șir, sau op1 S op take valorile := (echivalența) != (nu echivalența) op1 ia valorile: -z (șir de lungime zero) -n (șir de lungime diferită de zero) În cele din urmă, mai multe verificări de diferite tipuri pot fi combinate cu operații logice - a (ȘI) și -o (SAU) Exemple: $ if test -w $2 -a -r S1 > atunci cat $1 >> $2 > else echo "nu se poate adăuga" > fi $ paranteze pătrate, adică dacă [...] în loc de testul dacă...

7.12. instrucțiunea în buclă while

Sintaxă: while do done Dacă „comanda” reușește, atunci executați „comenzile” terminate de cuvântul cheie done. Exemplu: if test $# -eq 0 then echo "Usage: $0 file ..." > &2 exit fi while test $# -gt 0 do if test -s $1 then echo "no file $1" > &2 else sort + 1 - 2 $1 | tr -d ... (proceduri) fi shift (* renumerota argumentele *) done Procedurile sunt executate pe toate argumentele.

7.13. până la instrucțiunea buclei

Inversează condiția de repetare de la while Sintaxă: până când do done Până când „comandă” reușește, executați comenzile terminate de cuvântul done. Exemplu: dacă testul S# -eq 0, atunci echo "Utilizarea fișierului $0..." > &2 exit fi până la testul S# -eq 0 do if test -s $1 atunci echo "niciun fișier $1" > &2 else sort +1 - 2 $1 | tr -d ... (procedură) fi shift (deplasare argument) făcut Similar cu cel precedent.

7.14. declarație de selecție a cazului

Sintaxă: caz în șir1) ;; șir2) ;; șir3) ... etc. ... esac Exemplu: Fie ca procedura să aibă o opțiune -t care poate fi dată ca prim parametru: ................. împreună = fără caz ​​$1 în -t) împreună = da tura ;; -?) echo "$0: nicio opțiune $1" exit ;; esac if test $together = yes then sort ... fi unde? - metacaracter (dacă -?, adică „o altă opțiune”, alta decât -t, atunci o eroare). Pot fi utilizate toate metacaracterele shell, inclusiv ?, *, [-]. Este ușor să adăugați (în exemplu) alte opțiuni prin simpla extindere a carcasei.

7.15. Utilizarea fișierelor temporare din directorul /tmp

Acesta este un director special în care toate fișierele pot fi scrise de către toți utilizatorii. Dacă o procedură care creează un fișier temporar este folosită de mai mulți utilizatori, atunci este necesar să se asigure că numele sunt unice. fișiere create. Trucul standard este numele fișierului temporar $0$$, unde $0 este numele procedurii și $$ este o variabilă standard egală cu numărul unic de identificare al procesului care execută comanda curentă. Deși administratorul șterge periodic fișierele temporare din /tmp, este o bună practică să le ștergeți în mod explicit după utilizare.

7.16. Comentarii în proceduri

Ele încep cu două puncte:, care este considerată o comandă nulă, iar textul comentariului este argumentul său. Pentru a împiedica Shell să interpreteze metacaracterele ($, *, etc.), se recomandă includerea textului comentariului între ghilimele simple. În unele variante ale sistemului de operare UNIX, nota începe cu semnul #.

7.17. Exemplu de procedură

:"Această procedură funcționează pe fișiere care conțin nume" : "și numere de telefon," :"le sortează împreună sau separat și tipărește rezultatul pe" :"ecran sau imprimantă" :"Taste de procedură:" :"-t (împreună) - îmbinați și sortați toate fișierele împreună" :"-p (imprimantă) - imprimați fișierele pe imprimantă" dacă testul $# - eq 0 apoi echo "Utilizare: $ 0 fișier ... " > & 2 exit fi împreună = fără imprimare = nu în timp ce testul $# -gt 0 do case $1 în -t) împreună = yes shift ;; -p) print = da shift ;; -?) echo "$0: nicio opțiune $1" exit ;; *) dacă testează $împreună = da atunci sortează -u +1 -2 $1 | tr ... > /tmp/$0$$ if $print = nu atunci cat /tmp/$0$$ else lpr -c /tmp/$0$$ fi rm /tmp/$0$$ exit else if test -s $1 atunci echo "niciun fișier $1" > &2 else sort +1 -2 $1 | tr...> /tmp/$0$$ if $print = nu atunci cat /tmp/$0$$ else lpr -c /tmp/$0$$ fi rm /tmp/$0$$ fi shift fi;; esac facut. Procedura verifică numărul de parametri $#, iar dacă este zero, se termină. În caz contrar, procesează parametrii (instrucțiunea caz). Parametrul poate fi fie o cheie (un caracter precedat de un semn minus), fie un nume de fișier (un șir reprezentat de metacaracterul *). Dacă cheia nu este validă (metacaracterul? este diferit de t și p), procedura se încheie. În caz contrar, în funcție de prezența tastelor t și p, se execută acțiunile declarate în comentariu la începutul procedurii.

7.18. Gestionarea întreruperilor în proceduri

Dacă se primește un semnal de întrerupere în timpul execuției procedurii (de la tasta BREAK sau DEL, de exemplu), atunci toate fișierele temporare create vor rămâne neșterse (până când administratorul face acest lucru) din cauza încheierii imediate a procesului. Cea mai bună soluție este de a gestiona întreruperi în cadrul unei proceduri cu instrucțiunea capcană: Sintaxă: semnale trap „argumente de comandă”... Ghilimelele formează primul argument al mai multor comenzi separate prin punct și virgulă. Acestea vor fi executate dacă apare întreruperea specificată de argumente semnale (întregi): 2 - când întrerupeți procesul; 1 - dacă sunteți „atârnat” (deconectat de la sistem), etc. Exemplu (dezvoltarea celui precedent): cazul $1 în ..... *) capcană „rm /tmp/*; ieșire” 2 1 (eliminarea fișiere temporare) dacă testul -s $1 .............. rm /tmp/* Ar fi mai bine: trap "rm /tmp/* > /dev/null; exit" 2 1 ca anularea ar putea avea loc înainte de crearea fișierului /tmp/$0$$ și alarma despre acest caz este redirecționată către dispozitivul nul.

7.19. Efectuarea de operații aritmetice: expr

Comanda expr evaluează valoarea expresiei date ca argument și trimite rezultatul la ieșirea standard. Cea mai interesantă aplicație este de a efectua operațiuni pe variabile de limbaj Coajă. Exemplu de adăugare a 3 numere: $ cat sum3 expr $1 + $2 + $3 $ chmod 755 sum3 $ sum3 13 49 2 64 $ Exemplu de utilizare directă a comenzii: $ expr 13 + 49 + 2 + 64 + 1 129 $ Următorii operatori aritmetici poate fi folosit în expr - ry: +, -, *, /,% (restul). Toți operanzii și operațiile trebuie separați prin spații. Rețineți că semnul înmulțirii trebuie să fie cuprins între ghilimele (single sau duble), de exemplu: „*”, deoarece caracterul * are o semnificație specială în Shell. Un exemplu de expr mai complex într-o procedură (fragment): num = "wc -l

7.20. Depanarea procedurilor Shell

Există trei instrumente care vă permit să depanați proceduri. 1) Plasarea comenzilor ecou în corpul procedurii pentru a emite mesaje care sunt urma execuției procedurii. 2) Opțiunea -v (verbose = verbose) de pe o comandă Shell face ca comanda să fie tipărită pe ecran înainte de a fi executată. 3) Opțiunea -x (execute) din comanda Shell face ca comanda să fie tipărită pe ecran pe măsură ce este executată, înlocuind toate variabilele cu valorile lor; este cel mai puternic instrument.

  • tutorial

Bazele lui BASH. Partea 2.
Îmi cer scuze pentru întârzierea atât de mare între articole, dar sesiunea se face simțită în cel mai inoportun moment :)
Mulțumesc tuturor pentru comentariile, criticile și completările care au fost exprimate în comentariile la ultimul.
Această parte, așa cum am promis, va fi dedicată buclelor, operațiilor matematice și utilizării comenzilor externe.
Să începem.

cicluri. bucla for-in.

Operatorul for-in este conceput pentru a accesa valorile enumerate în listă unul câte unul. Fiecare valoare pe rând din listă este atribuită unei variabile.
Sintaxa este următoarea:
pentru variabila din value_list
do
echipe
Terminat

Luați în considerare un mic exemplu:

#!/bin/bash
pentru i în 0 1 2 3 4 #variabilei $i vor fi alocate valori de la 0 la 4 inclusiv
do
echo „Numărul consolei este $i” >> /dev/pts/$i #Scrieți șirul „Numărul consolei este $i” în fișierul /dev/pts/$i
terminat #ciclul încheiat
iesirea 0

După executarea exemplului, în primele 5 console virtuale (terminale) va apărea o linie cu numărul său. Valorile din listă sunt substituite alternativ în variabila $i și lucrul cu valoarea acestei variabile se realizează într-o buclă

cicluri. buclă while.

Bucla while este mai complexă decât bucla for-in și este folosită pentru a repeta comenzi în timp ce o anumită expresie este adevărată (codul de returnare = 0).
Sintaxa operatorului este următoarea:
în timp ce expresie sau comandă care returnează un cod de returnare
do
echipe
Terminat

Un exemplu de funcționare a buclei este prezentat în următorul exemplu:

#!/bin/bash
again=yes #atribuiți din nou valoarea „da” variabilei
while [ "$again" = "yes" ] #Vom bucla până când $again este egal cu "yes"
do
echo „Vă rugăm să introduceți un nume:”
citeste numele
echo „Numele introdus este $name”

Echo "Doriți să continuați?"
Citeste inca o data
Terminat
ecou "La revedere"


Și acum rezultatul scenariului:
[email protected]:~$ ./bash2_primer1.sh
Vă rugăm să introduceți un nume:
it
Numele introdus este ite
Vrei sa continui?
da
Vă rugăm să introduceți un nume:
Mihai
Numele pe care l-ai introdus este mihail
Vrei sa continui?
Nu
Pa! Pa

După cum puteți vedea, bucla este executată până când introducem altceva decât „da”. Între do și done, puteți descrie orice structuri, instrucțiuni etc., toate vor fi executate într-o buclă. Dar ar trebui să aveți grijă cu această buclă, dacă rulați orice comandă în ea fără a modifica variabila expresiei, puteți obține într-o buclă nesfârșită.
Acum, pentru condiția de adevăr. După un timp, la fel ca în instrucțiunea condiționată if-then-else, puteți introduce orice expresie sau comandă care returnează un cod de returnare, iar bucla va fi executată atâta timp cât codul de returnare = 0! Operatorul „[” este un analog al comenzii de testare, care verifică adevărul condiției care ia fost transmisă.

Să ne uităm la un alt exemplu, l-am luat din cartea Advanced Bash Scripting. Mi-a placut foarte mult :), dar am simplificat-o putin. În acest exemplu, ne vom familiariza cu un alt tip de bucle UNTIL-DO.. Acesta este aproape un analog complet al buclei WHILE-DO, doar că este executat în timp ce o anumită expresie este falsă.
Iată un exemplu:

#!/bin/bash
echo "Introduceți numărătorul: "
citeste dividend
echo "Introduceți numitorul: "
divizor citit

dnd=$dividend #vom modifica variabilele dividend și divizor,
#salvați cunoștințele lor în alte variabile, pentru că ne dau
#nevoie
dvs=$divizor
rest=1

Până la [ "$remainder" -eq 0 ]
do
fie "restul = dividend % divizor"
dividend=$divizor
divisor=$restul
Terminat

Echo „mcd al numerelor $dnd și $dvs = $dividend”


Rezultatul execuției scriptului:
[email protected]:~$ ./bash2_primer3.sh
Introduceți numărătorul:
100
Introduceți numitorul:
90
MCD al numerelor 100 și 90 = 10

Operatii matematice

lasa comanda.
Comanda let efectuează operații aritmetice pe numere și variabile.
Luați în considerare un mic exemplu în care efectuăm câteva calcule pe numerele introduse:
#!/bin/bash
echo "Introduceți a: "
Citeste o
echo "Introduceți b: "
citeste b

Fie „c = a + b” #adunare
echo "a+b= $c"
fie "c = a / b" #divizează
echo "a/b= $c"
lasă „c<<= 2" #сдвигает c на 2 разряда влево
echo "c după schimbarea cu 2 biți: $c"
fie „c = a % b” # găsește restul când a este împărțit la b
echo "$a / $b. rest: $c "


Rezultatul executiei:
[email protected]:~$ ./bash2_primer2.sh
Introduceți un:
123
Introdu b:
12
a+b=135
a/b=10
c după schimbarea cu 2 biți: 40
123 / 12. rest: 3

Ei bine, după cum puteți vedea, nimic complicat, lista de operații matematice este standard:
+ - adaos
- - scădere
* - înmulțire
/ - Divizia
** - exponentiare
% - modulo(diviziunea modulului), restul diviziunii
let vă permite să utilizați abrevieri pentru comenzile aritmetice, reducând astfel numărul de variabile utilizate. De exemplu: a = a+b este echivalent cu a +=b etc.

Lucrul cu programe externe atunci când scrieți scripturi shell

Să începem cu o teorie utilă.
Redirecționarea fluxului.
Bash (și multe alte shell-uri) are descriptori de fișier încorporați: 0 (stdin), 1 (stdout), 2 (stderr).
stdout - Ieșire standard. Tot ceea ce ies din programe merge aici.
stdin - Intrare standard. Acesta este tot ceea ce introduce utilizatorul în consolă
stderr - Ieșire eroare standard.
Pentru operațiuni pe aceste mânere, există Simboluri speciale:> (redirecționare de ieșire),< (перенаправление ввода). Оперировать ими не сложно. Например:
redirecționează ieșirea comenzii cat /dev/random către /dev/null (operație absolut inutilă :))) sau
scrieți conținutul directorului curent în fișierul de listare (deja mai util)
Dacă este nevoie să atașați fișierului (atunci când folosiți „>”, acesta este înlocuit), trebuie să utilizați „>>” în loc de „>”
după ce ai cerut sudo să introducă parola, aceasta va fi luată din fișierul my_password ca și cum ai fi introdus-o de la tastatură.
Dacă este necesar să scrieți în fișier numai erori care ar fi putut apărea în timpul funcționării programului, atunci puteți utiliza:
./program_with_error 2> error_file
numărul 2 înainte de „>” înseamnă că tot ceea ce intră în descriptorul 2 (stderr) ar trebui redirecționat.
Dacă este necesar să forțați stderr să scrie în stdout, atunci acest lucru se poate face după cum urmează. cale:
caracterul „&” înseamnă indicator către descriptorul 1 (stdout)
(În mod implicit, stderr scrie pe consola în care lucrează utilizatorul (mai probabil să scrie pe ecran)).
2. Transportoare.
Conducta este un instrument foarte puternic pentru lucrul cu consola Bash. Sintaxa este simplă:
echipa1 | comanda 2 - înseamnă că ieșirea comenzii 1 va fi transmisă la intrarea comenzii 2
Conductele pot fi grupate în lanțuri și ieșire folosind redirecționarea către un fișier, de exemplu:
ls -la | grep "hash" |sortare > sortlg_list
Ieșirea comenzii ls -la este transmisă la comanda grep, care selectează toate liniile care conțin cuvântul hash și este transmisă la comanda sortare, care scrie rezultatul în fișierul sorting_list. Totul este destul de clar și simplu.

Cel mai adesea, scripturile Bash sunt folosite ca automatizare a unor operațiuni de rutină în consolă, de aceea uneori devine necesară procesarea stdout-ului unei comenzi și transferarea lui la stdin la o altă comandă, în timp ce rezultatul executării unei comenzi trebuie procesat în într-un fel. În această secțiune, voi încerca să explic principiile de bază ale lucrului cu comenzi externe în interiorul unui script. Cred că am dat destule exemple și acum pot scrie doar punctele principale.

1. Trecerea ieșirii unei variabile.
Pentru a scrie ieșirea unei comenzi într-o variabilă, este suficient să includeți comanda între ghilimele ``, de exemplu
a = `echo "qwerty"`
ecou $a

Rezultatul muncii: qwerty


Cu toate acestea, dacă doriți să scrieți o listă de directoare într-o variabilă, trebuie să procesați corect rezultatul pentru a pune datele în variabilă. Să luăm în considerare un mic exemplu:
LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (tipărește $4)"| sort|uniq| tr "\n" " "`
pentru ONE_OF_LIST din $LIST
do
svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST
Terminat

Aici folosim o buclă for-do-done pentru a arhiva toate directoarele din folderul /svn/ folosind comanda svnadmin hotcopy (ceea ce nu contează pentru nimeni în cazul nostru, doar ca exemplu). Cea mai interesantă linie este: LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (tipărește $4)"| sort|uniq| tr "\n" " "` În ea, variabilei LIST i se atribuie execuția comenzii find procesate de comenzile awk, sort, uniq, tr (nu vom lua în considerare toate aceste comenzi, deoarece acesta este un articol separat). Variabila LIST va conține numele tuturor directoarelor din folderul /svn/ plasate pe o singură linie (pentru a elimina bucla.

După cum puteți vedea, totul nu este dificil, este suficient să înțelegeți principiul și să scrieți câteva dintre propriile scenarii. În concluzie, vreau să vă urez succes în învățarea BASH și Linux în general. Criticile, ca de obicei, sunt binevenite. Următorul articol va fi probabil dedicat utilizării unor programe precum sed, awk.

Limbajul de programare shell are mai multe constructe care vor oferi flexibilitate programelor dvs.:

  • comentariile vă permit să descrieți funcțiile programului;
  • „documentul aici” vă permite să includeți șiruri de caractere în programele shell care vor fi redirecționate ca intrare către anumite comenzi ale programului shell;
  • comanda de ieșire vă permite să terminați programul în punctul dorit și să utilizați coduri de retur;
  • Construcțiile bucle pentru, while vă permit să repetați un grup de comenzi într-o buclă;
  • comenzile condițional if și case execută un grup de comenzi dacă o anumită condiție este îndeplinită;
  • Comanda break vă permite să ieșiți necondiționat din buclă.

9.3.1. Comentarii

Pentru a plasa comentarii în program, utilizați semnul #. Dacă semnul # este după comandă, atunci comanda în sine este executată, iar comentariul este ignorat. Formatul liniei de comentariu:

#cometariu

9.3.2. "aici document"

„Aici document” vă permite să plasați linii într-un program shell care sunt redirecționate ca intrare către o comandă din acel program. Aceasta este o modalitate de a furniza intrare pentru o comandă într-un program shell fără a utiliza un fișier separat. Intrarea constă dintr-un caracter de redirecționare<< и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.

Formatul comenzii este următorul:

comanda<...linii de intrare... delimitator

9.3.3. Utilizarea ed într-un program shell

„Aici documentul” sugerează o modalitate de a utiliza ed într-un program shell. Să presupunem că doriți să creați un program shell care va apela editorul ed, va face modificări globale unui fișier, va scrie modificările în fișier și apoi va părăsi ed. Următorul ecran arată conținutul programului ch.text, care efectuează aceste sarcini:

$cat ch.text echo Introduceți numele fișierului read file1 echo Introduceți textul exact care trebuie schimbat. read old_text echo Introduceți textul nou exact pentru a înlocui textul de mai sus. citește text_nou ed - $fișier1<

Observați semnul - (minus) în comanda ed. Această opțiune împiedică tipărirea numărului de caractere pe ecran. De asemenea, rețineți formatul comenzii ed pentru înlocuirea globală:

G/$text_vechi/s//$text_nou/g

Programul folosește 3 variabile: fișier1, text_vechi, text_nou. Când rulează, acest program folosește comanda de citire pentru a obține valorile acestor variabile. Aceste variabile conțin următoarele informații:
fisier - numele fisierului de editat;
text_vechi - text de modificat;
text_nou - text nou.

Variabilele sunt introduse în program, aici documentul redirecționează comanda de înlocuire globală, comanda de scriere și comanda de completare către comanda ed. Rulați programul ch.text. Obțineți următorul ecran:

$ch.text Introduceți nota cu numele fișierului Introduceți textul exact care trebuie modificat. Dragă John: Introduceți textul nou exact pentru a înlocui textul de mai sus. La ceea ce poate viza: $ notă de pisică La ceea ce poate viza: $

9.3.4. Codurile de completare

Majoritatea comenzilor shell returnează coduri care indică dacă comanda a fost finalizată cu succes. Dacă valoarea returnată este 0 (zero), atunci comanda a avut succes. Codurile de returnare nu sunt tipărite automat, dar pot fi preluate ca valoare a parametrului special shell $?.

9.3.4.1. Verificarea codurilor de ieșire

După ce ați executat comanda interactiv, puteți vedea codul de ieșire pe măsură ce introduceți:

eco $? Luați în considerare următorul exemplu: $ cat hi Acesta este fișierul hi. $ echo $? 0 $ cat hello cat: nu se poate deschide hello $ echo $? 2 dolari

În primul caz, fișierul hi există în directorul dvs. și aveți permisiunea de citire. Cu comanda cat, puteți imprima conținutul unui fișier. Rezultatul comenzii cat este codul de returnare 0, pe care îl obțineți cu parametrul $?. În al doilea caz, fișierul fie nu există, fie nu aveți acces de citire. Comanda cat imprimă un mesaj de diagnosticare și returnează codul 2.

Programul shell se iese normal când ultima comandă din fișier este executată. Cu toate acestea, puteți utiliza comanda exit pentru a încheia programul. Mai important, puteți folosi comanda exit pentru a obține coduri de ieșire din programul shell.

9.3.5. Cicluri

Instrucțiunile bucle for și while vă permit să executați o comandă sau o secvență de comenzi de mai multe ori.

9.3.5.1. pentru declarație

Instrucțiunea for execută o secvență de comenzi pentru fiecare element al listei. Are formatul:

Pentru variabile într-o_listă_de_valori do comanda_1 comanda_2 . . . ultima comandă Terminat

Pentru fiecare iterație a buclei, următorul element al listei este atribuit variabilei date în instrucțiunea for. Această variabilă poate fi referită oriunde în comenzile unei instrucțiuni do. Când construiți fiecare secțiune de comandă, trebuie să vă asigurați că fiecare do se potrivește cu un done la sfârșitul buclei.

Variabila poate avea orice nume. De exemplu, dacă variabila dvs. este numită var, atunci referirea la $var în lista de comenzi va face valoarea disponibilă. Dacă operatorul in este omis, atunci valoarea pentru var va fi setul de argumente specificat în comandă și disponibil în parametrul special $*. Lista de comenzi dintre cuvântul cheie do și done va fi executată pentru fiecare valoare.

Când comenzile sunt executate pentru ultimul element al listei, programul va executa linia de mai jos gata.

9.3.5.2. în timp ce declarația

Instrucțiunea while loop folosește 2 grupuri de comenzi. Va executa secvența de comenzi din al doilea grup (lista do ... done) până când ultima comandă din primul grup (lista while) va returna adevărată, indicând că expresia de după do poate fi executată.

Formatul general al instrucțiunii buclei while este:

In timp ce comanda_1 . . . ultima comandă do comanda_1 . . . ultima comandă Terminat

De exemplu, programul enter.name folosește o buclă while pentru a introduce o listă de nume într-un fișier. Programul constă din următoarele linii de comandă:

$ cat enter.name în timp ce citește x face eco $x>>xfile done $

Cu câteva completări, obținem următorul program:

$ cat enter.name echo Vă rugăm să introduceți numele fiecărei persoane și apoi a echo Încheiați lista de nume cu a<^d>while read x do echo $x>>xfile done echo xfile conține următoarele nume: cat xfile $

Vă rugăm să rețineți că, după ce bucla este finalizată, programul execută comenzile de mai jos gata.

Primele două comenzi echo folosesc caractere speciale, așa că trebuie să folosiți ghilimele pentru a scăpa de sensul special. Următorul ecran arată rezultatul programului enter.name:

$enter.name Vă rugăm să introduceți numele fiecărei persoane și decât a Vă rugăm să încheiați lista de nume cu a<^d>Mary Lou Janice <^d>xfile conține următoarele nume: Mary Lou Janice $

După ce bucla s-a terminat, programul va tipări toate numele conținute în fișierul x.

9.3.6. Folosind /dev/null

Sistemul de fișiere are un fișier /dev/null unde puteți stoca rezultate nedorite. De exemplu, dacă introduceți pur și simplu comanda who, sistemul va răspunde cine lucrează în sistem. Dacă redirecționați rezultatul acestei comenzi către /dev/null:

Cine > /dev/null nu va primi un răspuns.

9.3.7. Declarații condiționale

dacă... atunci declarație

Comanda if spune programului shell să execute secvența de comenzi după apoi dacă ultima comandă din lista de comenzi din construcția if a reușit. Construcțiile if se termină cu cuvântul cheie fi.

Formatul general al constructului if este:

Dacă comanda_1 . . . ultima comandă apoi comanda_1 . . . ultima comandă fi

De exemplu, programul shell de căutare demonstrează utilizarea if... then construct. Programul de căutare folosește comanda grep pentru a căuta un cuvânt într-un fișier. Dacă grep reușește, programul afișează cuvântul găsit. Ecranul va arăta astfel:

$ cautare pisici echo Introduceți cuvântul și numele fișierului. citește fișierul cuvânt dacă grep $cuvânt $fișier, atunci echo $cuvânt este în $fișier fi $

Acest program afișează rezultatul comenzii grep. Dacă doriți să stocați răspunsul sistemului la comanda grep în programul dvs., utilizați fișierul /dev/null schimbând linia de comandă if la următoarea:

grep $cuvânt $fișier > /dev/null

Acum rulați comanda de căutare. Acesta va răspunde doar cu mesajul specificat după comanda echo.

Construcția if ... then ... else poate executa un set alternativ de comenzi după else dacă secvența if este falsă. Formatul acestui construct este următorul:

Dacă comanda_1 . . . ultima comandă .linthen comanda_1 . . . ultima comandă altfel comanda_1 . . . ultima comandă fi

Cu acest construct, puteți îmbunătăți programul de căutare, astfel încât să vă spună atât cuvântul găsit, cât și că cuvântul nu a fost găsit. În acest caz, programul de căutare ar arăta astfel:

$ cautare pisici echo Introduceți cuvântul și numele fișierului. citește fișierul cuvânt dacă grep $cuvânt $fișier > /dev/null atunci echo $cuvânt este în $fișier altfel echo $cuvânt NU este în $fișier fi $

comanda de testare

Comanda test este folosită pentru a organiza o buclă. Verifică dacă anumite condiții sunt adevărate și este utilă pentru organizarea constructelor condiționate. Dacă condiția este adevărată, atunci bucla va continua. Dacă condiția este falsă, atunci bucla se va încheia și următoarea comandă va fi executată. Câteva exemple de utilizare a comenzii test: fișierul test -r true dacă fișierul există și este lizibil; test -w fișier true dacă fișierul există și poate fi scris; test -x fișier true dacă fișierul există și este executabil; fișierul test -s true dacă fișierul există și are cel puțin un caracter; test var1 -eq var2 adevărat dacă var1 este egal cu var2; test var1 -ne var2 adevărat dacă var1 nu este egal cu var2.

Exemplu. Să creăm un program shell care mută toate fișierele executabile din directorul curent în directorul bin. Pentru a face acest lucru, utilizați comanda test -x pentru a selecta fișierele executabile. Programul mv.file va arăta astfel:

$cat mv.file tip echo în calea directorului cale de citire pentru fișier do if test -x $fișier apoi mv $fișier $cale/$fișier fi făcut $

Construcția case ... esac vă permite să selectați unul dintre mai multe modele și apoi să executați o listă de comenzi pentru acel model. Expresia șablon trebuie să înceapă cu cuvântul cheie in, iar paranteza dreaptă trebuie plasată după ultimul caracter al fiecărui șablon. Secvența de comenzi pentru fiecare model se termină cu două caractere;;. Declarația case trebuie să se termine cu cuvântul cheie esac.

Formatul general al constructului caz este:

cuvânt de caz în model 1) linia de comandă 1 . . . ultima linie de comandă ;;model 2) linia de comandă 1 . . ultima linie de comandă ;;model 3) linia de comandă 1 . . ultima linie de comandă ;; *)linia de comandă 1 . . ultima linie de comandă ;;esac

Construcția caz încearcă să găsească un cuvânt cu model în prima secțiune a modelului. Dacă căutarea are succes, atunci programul execută linii de comandă după primul model până la caracterele corespunzătoare;;.

Dacă primul șablon nu este găsit, atunci se realizează tranziția la al doilea șablon. Dacă se găsește vreun model, atunci programul nu ia în considerare modelele rămase, ci trece la comanda după esac. Semnul * este folosit ca model pentru a se potrivi cu orice cuvânt și, astfel, vă oferă un set de comenzi care trebuie executate dacă nu este găsit niciun alt model. Prin urmare, modelul asterisc (*) este plasat ca ultimul model în construcția de caz, astfel încât alte modele să fie verificate mai întâi. Acest lucru vă va ajuta să detectați intrările nevalide și neașteptate.

Caracterele metalice *, ?, . Acest lucru oferă flexibilitate programului.

Luați în considerare un exemplu. Programul set.term setează variabila TERM în funcție de tipul de terminal pe care îl utilizați. Se folosește următoarea linie de comandă:

TERM=nume_terminal

Modelul * este ultimul din lista de modele. Emite un mesaj de avertizare că nu există un șablon potrivit pentru tipul de terminal specificat și vă permite să finalizați construcția cazului.

$cat set.term echo Dacă aveți un tip TTY 4420 în 4420 echo Dacă aveți un tip TTY 5410 în 5410 echo Dacă aveți un tip TTY 5420 în 5420 citiți termenul caz termen în 4420) TERM-T4 ;; 5410) TERM-T5;; 5420) TERM-T7;; *) echo nu este un tip de terminal corect ;; esac export TERM echo sfârşitul programului $

9.3.8. Transfer necondiționat de control

Comanda break oprește necondiționat execuția oricărei bucle în care are loc și transferă controlul către comanda după cuvintele cheie done, fi sau esac.

În exemplul anterior de program set.term, puteți utiliza comanda break în loc de echo pentru a părăsi programul, așa cum se arată în exemplul următor:

$cat set.term echo Dacă aveți un tip TTY 4420 în 4420 echo Dacă aveți un tip TTY 5410 în 5410 echo Dacă aveți un tip TTY 5420 în 5420 citiți termenul caz termen în 4420) TERM-T4 ;; 5410) TERM-T5;; 5420) TERM-T7;; *) pauză ;; esac export TERM echo sfârşitul programului $

Comanda continue va face ca programul să sară imediat la următoarea iterație a buclei while sau for fără a executa restul comenzilor din buclă.

  • tutorial

Bazele lui BASH. Partea 2.
Îmi cer scuze pentru întârzierea atât de mare între articole, dar sesiunea se face simțită în cel mai inoportun moment :)
Vă mulțumim tuturor pentru comentariile, criticile și completările voastre, care au fost exprimate în comentariile la ultimul articol.
Această parte, așa cum am promis, va fi dedicată buclelor, operațiilor matematice și utilizării comenzilor externe.
Să începem.

cicluri. bucla for-in.

Operatorul for-in este conceput pentru a accesa valorile enumerate în listă unul câte unul. Fiecare valoare pe rând din listă este atribuită unei variabile.
Sintaxa este următoarea:
pentru variabila din value_list
do
echipe
Terminat

Luați în considerare un mic exemplu:

#!/bin/bash
pentru i în 0 1 2 3 4 #variabilei $i vor fi alocate valori de la 0 la 4 inclusiv
do
echo „Numărul consolei este $i” >> /dev/pts/$i #Scrieți șirul „Numărul consolei este $i” în fișierul /dev/pts/$i
terminat #ciclul încheiat
iesirea 0

După executarea exemplului, în primele 5 console virtuale (terminale) va apărea o linie cu numărul său. Valorile din listă sunt substituite alternativ în variabila $i și lucrul cu valoarea acestei variabile se realizează într-o buclă

cicluri. buclă while.

Bucla while este mai complexă decât bucla for-in și este folosită pentru a repeta comenzi în timp ce o anumită expresie este adevărată (codul de returnare = 0).
Sintaxa operatorului este următoarea:
în timp ce expresie sau comandă care returnează un cod de returnare
do
echipe
Terminat

Un exemplu de funcționare a buclei este prezentat în următorul exemplu:

#!/bin/bash
again=yes #atribuiți din nou valoarea „da” variabilei
while [ "$again" = "yes" ] #Vom bucla până când $again este egal cu "yes"
do
echo „Vă rugăm să introduceți un nume:”
citeste numele
echo „Numele introdus este $name”

Echo "Doriți să continuați?"
Citeste inca o data
Terminat
ecou "La revedere"


Și acum rezultatul scenariului:
[email protected]:~$ ./bash2_primer1.sh
Vă rugăm să introduceți un nume:
it
Numele introdus este ite
Vrei sa continui?
da
Vă rugăm să introduceți un nume:
Mihai
Numele pe care l-ai introdus este mihail
Vrei sa continui?
Nu
Pa! Pa

După cum puteți vedea, bucla este executată până când introducem altceva decât „da”. Între do și done, puteți descrie orice structuri, instrucțiuni etc., toate vor fi executate într-o buclă. Dar ar trebui să aveți grijă cu această buclă, dacă rulați orice comandă în ea fără a modifica variabila expresiei, puteți obține într-o buclă nesfârșită.
Acum, pentru condiția de adevăr. După un timp, la fel ca în instrucțiunea condiționată if-then-else, puteți introduce orice expresie sau comandă care returnează un cod de returnare, iar bucla va fi executată atâta timp cât codul de returnare = 0! Operatorul „[” este un analog al comenzii de testare, care verifică adevărul condiției care ia fost transmisă.

Să ne uităm la un alt exemplu, l-am luat din cartea Advanced Bash Scripting. Mi-a placut foarte mult :), dar am simplificat-o putin. În acest exemplu, ne vom familiariza cu un alt tip de bucle UNTIL-DO.. Acesta este aproape un analog complet al buclei WHILE-DO, doar că este executat în timp ce o anumită expresie este falsă.
Iată un exemplu:

#!/bin/bash
echo "Introduceți numărătorul: "
citeste dividend
echo "Introduceți numitorul: "
divizor citit

dnd=$dividend #vom modifica variabilele dividend și divizor,
#salvați cunoștințele lor în alte variabile, pentru că ne dau
#nevoie
dvs=$divizor
rest=1

Până la [ "$remainder" -eq 0 ]
do
fie "restul = dividend % divizor"
dividend=$divizor
divisor=$restul
Terminat

Echo „mcd al numerelor $dnd și $dvs = $dividend”


Rezultatul execuției scriptului:
[email protected]:~$ ./bash2_primer3.sh
Introduceți numărătorul:
100
Introduceți numitorul:
90
MCD al numerelor 100 și 90 = 10

Operatii matematice

lasa comanda.
Comanda let efectuează operații aritmetice pe numere și variabile.
Luați în considerare un mic exemplu în care efectuăm câteva calcule pe numerele introduse:
#!/bin/bash
echo "Introduceți a: "
Citeste o
echo "Introduceți b: "
citeste b

Fie „c = a + b” #adunare
echo "a+b= $c"
fie "c = a / b" #divizează
echo "a/b= $c"
lasă „c<<= 2" #сдвигает c на 2 разряда влево
echo "c după schimbarea cu 2 biți: $c"
fie „c = a % b” # găsește restul când a este împărțit la b
echo "$a / $b. rest: $c "


Rezultatul executiei:
[email protected]:~$ ./bash2_primer2.sh
Introduceți un:
123
Introdu b:
12
a+b=135
a/b=10
c după schimbarea cu 2 biți: 40
123 / 12. rest: 3

Ei bine, după cum puteți vedea, nimic complicat, lista de operații matematice este standard:
+ - adaos
- - scădere
* - înmulțire
/ - Divizia
** - exponentiare
% - modulo(diviziunea modulului), restul diviziunii
let vă permite să utilizați abrevieri pentru comenzile aritmetice, reducând astfel numărul de variabile utilizate. De exemplu: a = a+b este echivalent cu a +=b etc.

Lucrul cu programe externe atunci când scrieți scripturi shell

Să începem cu o teorie utilă.
Redirecționarea fluxului.
Bash (și multe alte shell-uri) are descriptori de fișier încorporați: 0 (stdin), 1 (stdout), 2 (stderr).
stdout - Ieșire standard. Tot ceea ce ies din programe merge aici.
stdin - Intrare standard. Acesta este tot ceea ce introduce utilizatorul în consolă
stderr - Ieșire eroare standard.
Pentru operațiunile pe acești descriptori, există caractere speciale: > (redirecționare ieșire),< (перенаправление ввода). Оперировать ими не сложно. Например:
redirecționează ieșirea comenzii cat /dev/random către /dev/null (operație absolut inutilă :))) sau
scrieți conținutul directorului curent în fișierul de listare (deja mai util)
Dacă este nevoie să atașați fișierului (atunci când folosiți „>”, acesta este înlocuit), trebuie să utilizați „>>” în loc de „>”
după ce ai cerut sudo să introducă parola, aceasta va fi luată din fișierul my_password ca și cum ai fi introdus-o de la tastatură.
Dacă este necesar să scrieți în fișier numai erori care ar fi putut apărea în timpul funcționării programului, atunci puteți utiliza:
./program_with_error 2> error_file
numărul 2 înainte de „>” înseamnă că tot ceea ce intră în descriptorul 2 (stderr) ar trebui redirecționat.
Dacă este necesar să forțați stderr să scrie în stdout, atunci acest lucru se poate face după cum urmează. cale:
caracterul „&” înseamnă indicator către descriptorul 1 (stdout)
(În mod implicit, stderr scrie pe consola în care lucrează utilizatorul (mai probabil să scrie pe ecran)).
2. Transportoare.
Conducta este un instrument foarte puternic pentru lucrul cu consola Bash. Sintaxa este simplă:
echipa1 | comanda 2 - înseamnă că ieșirea comenzii 1 va fi transmisă la intrarea comenzii 2
Conductele pot fi grupate în lanțuri și ieșire folosind redirecționarea către un fișier, de exemplu:
ls -la | grep "hash" |sortare > sortlg_list
Ieșirea comenzii ls -la este transmisă la comanda grep, care selectează toate liniile care conțin cuvântul hash și este transmisă la comanda sortare, care scrie rezultatul în fișierul sorting_list. Totul este destul de clar și simplu.

Cel mai adesea, scripturile Bash sunt folosite ca automatizare a unor operațiuni de rutină în consolă, de aceea uneori devine necesară procesarea stdout-ului unei comenzi și transferarea lui la stdin la o altă comandă, în timp ce rezultatul executării unei comenzi trebuie procesat în într-un fel. În această secțiune, voi încerca să explic principiile de bază ale lucrului cu comenzi externe în interiorul unui script. Cred că am dat destule exemple și acum pot scrie doar punctele principale.

1. Trecerea ieșirii unei variabile.
Pentru a scrie ieșirea unei comenzi într-o variabilă, este suficient să includeți comanda între ghilimele ``, de exemplu
a = `echo "qwerty"`
ecou $a

Rezultatul muncii: qwerty


Cu toate acestea, dacă doriți să scrieți o listă de directoare într-o variabilă, trebuie să procesați corect rezultatul pentru a pune datele în variabilă. Să luăm în considerare un mic exemplu:
LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (tipărește $4)"| sort|uniq| tr "\n" " "`
pentru ONE_OF_LIST din $LIST
do
svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST
Terminat

Aici folosim o buclă for-do-done pentru a arhiva toate directoarele din folderul /svn/ folosind comanda svnadmin hotcopy (ceea ce nu contează pentru nimeni în cazul nostru, doar ca exemplu). Cea mai interesantă linie este: LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (tipărește $4)"| sort|uniq| tr "\n" " "` În ea, variabilei LIST i se atribuie execuția comenzii find procesate de comenzile awk, sort, uniq, tr (nu vom lua în considerare toate aceste comenzi, deoarece acesta este un articol separat). Variabila LIST va conține numele tuturor directoarelor din folderul /svn/ plasate pe o singură linie (pentru a elimina bucla.

După cum puteți vedea, totul nu este dificil, este suficient să înțelegeți principiul și să scrieți câteva dintre propriile scenarii. În concluzie, vreau să vă urez succes în învățarea BASH și Linux în general. Criticile, ca de obicei, sunt binevenite. Următorul articol va fi probabil dedicat utilizării unor programe precum sed, awk.