Lectia 1: for
Sintaxa: for NAME in WORDS ... ; do COMMANDS; done
Executarea unor/unei comenzi pentru fiecare cuvant din lista WORDS ... NAME este un nume de variabila care va fi inlocuit la fiecare bucla a rularii comenzilor COMMANDS cu urmatorul element din lista.
Exemplu:
for var in ala bala portocala
do
echo Eu zic $var
done
Rezultat:
Eu zic ala
Eu zic bala
Eu zic portocala
Acuma intervine faptul ca shell-ul inainte de a executa orice va expanda toate wildcardurile gen * (inlocuieste oricate litere) si ? (inlocuieste o singura litera) deci:
for i in *.mp3
do
fa_ceva_lui $i
done
La executie *.mp3 va fi inlocuit cu numele tuturor fisierelor (si directoarelor, atentie) din directorul curent care se termina cu “.mp3”, deci comanda fa_ceva_lui va fi executata pt fiecare din ele
Atentie: Daca numele unui fisier “cules” de comanda for contine spatii in nume, se pot intampla chestii funny - exemplu:
Avem intr-un director un fisier numit “Ana are mere.mp3”. Comanda urmatoare (stergerea tutoror fisierelor .mp3):
for i in *.mp3 ; do rm $i ; done
va zice asa:
rm: cannot remove `Ana': No such file or directory
rm: cannot remove `Are': No such file or directory
rm: cannot remove `Mere.mp3': No such file or directory
Deoarece linia rm $i va fi expandata ca rm Ana Are Mere.mp3 deci rm urmat de 3 nume de fisiere care trebuie sa le stearga - spatiul fiind delimitatorul intre parametrii pe linia de comanda. Las ca exercitiu de gandire ce se intampla daca fisierul se numea “-r * .. .mp3” - nume perfect valid (Hint: NU incercati pe un calculator pe care aveti date care nu le vreti sterse- comanda rm NU pune nimica in Trashcan - sterge pur si simplu)
Ce sa facem in cazul asta ? Simplu:
for i in *.mp3 ; do rm "$i" ; done
Ghilimelele din jurul lui $i vor face ca numele fisierului cu toate ca contine spatii sa fie tratat ca un singur sir.
Chestii semi-utile de facut cu for - redenumirea tuturor fisierelor cu extensia .jpg din director-ul curent ca numar-nume.jpg unde numar se tot incrementeaza.
numar=1
for nume in *.jpg
do
mv $nume ${numar}-${nume}
let numar=numar+1
done
Explicatii:
${numar} este o metoda alternata de a scrie numele lunei variabile (in loc de $numar) pentru a fi sigur ca variabila va fi implementata corect. De exemplu daca avem for i in mumu bubu si vrem sa stergem fisierele mumulender si bubulender daca dam rm $ilender shell-ul nu o sa stie cine e variabila ilender. Asa ca zicem rm ${i}lender
* DE OBICEI se expandeaza cu numele fisierelor in ordine alfabetica crescatoare DAR unele shell-uri expandeaza in ordinea in care fisierele au fost scrise in director - puteti sa dati un echo * ca sa verificati.