Differences

This shows you the differences between two versions of the page.

Link to this comparison view

uso:cursuri:curs-06 [2022/10/03 21:18]
sergiu.weisz
uso:cursuri:curs-06 [2022/11/07 15:27] (current)
sergiu.weisz
Line 1: Line 1:
-====== Curs 06 - Interfața în linia de comandă ​=======+====== Curs 06 - Automatizarea sarcinilor. Shell scripting ​=======
  
-  * [[https://drive.google.com/​file/d/1pZYLv8U2p6rWnGzyjhU-_X0QPuKbZDr0/view?​usp=sharing|Slide-uri curs]] +  * [[https://docs.google.com/​presentation/d/1WF2R5P-L0bRIQu--DwQNH3lMeJY03qAT/edit?​usp=sharing&​ouid=108131427433094834232&​rtpof=true&​sd=true| Slide-uri curs]]
-  * [[https://​drive.google.com/​file/​d/​1x0Fv62Hpfd8p-SY37WNf80qA7WwmCmBg/​view?​usp=sharing|Handout 3on1 and notes space]] +
-  * [[https://​drive.google.com/​file/​d/​1wPLeKVO7MgMfVXi5kH4f8Gm_Qc25zqO7/​view?​usp=sharing|Handout 6on1]] +
-  * **Cuvinte cheie**: interfață,​ GUI, CLI, prompt, comandă, argumente, command completion, istoric de comenzi, shell, terminal, documentare,​ libreadline,​ ''>'',​ ''<'',​ ''&'',​ ''​|'',​ ''​||'',​ ''&&'',​ '';'',​ ''​%%"​%%'',​ %%'%%, ''​\'',​ ''​$'',​ one liner, variabile, variabile de mediu, escaping, expandare, globbing+
   * **Suport de curs**   * **Suport de curs**
     * [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor de operare]]     * [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor de operare]]
-        * Secțiunea ​Interfata in linia de comanda+        * Secțiunea ​13 Automatizarea sarcinilor
  
-/*+<​HTML>​ 
 +<​center>​ 
 +<iframe src="​https:​//​docs.google.com/​presentation/​d/​e/​2PACX-1vSX5DZFvcDSXTq-6Ix7A7b4u0eJyuS2akgtTf88P5WUazC6opuAfqtkLsFyC3H4jg/​embed?​start=false&​loop=false&​delayms=3000"​ frameborder="​0"​ width="​480"​ height="​389"​ allowfullscreen="​true"​ mozallowfullscreen="​true"​ webkitallowfullscreen="​true"></​iframe>​ 
 +</​center>​ 
 +</​HTML>​
  
-====== Curs 05 - Administrarea sistemului de fișiere =======+===== Demo =====
  
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-05/​curs-05-handout.pdf|Slide-uri curs]] +Ce este un script?
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-05/​curs-05-handout-4on1-notes.pdf|Handout 4on1 and notes space]] +
-  * [[http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-05/​curs-05-handout-8on1.pdf|Handout 8on1]] +
-  * **Cuvinte cheie**: sistem de fișiere, fizic și virtual, disc, partiție, partiționare,​ MBR, GPT, formatare, ''​fdisk'',​ ''​mkfs'',​ montare, ''​mount'',​ ''​umount'',​ link-uri, dispozitive,​ permisiuni, //user, group, others//, //read, write, execute//, ''​chmod'',​ ''​chown''​ +
-  * **Suport de curs** +
-    * [[http://​books.google.com/​books?id=_JFGzyRxQGcC | Introducere în sisteme de operare]] +
-      * [[http://​books.google.com/​books?​id=_JFGzyRxQGcC&​pg=PA69 | Capitolul 4 - Sisteme de fișiere]] +
-        * Secțiunile 4.3.7, 4.5, 4.7, 4.8+
  
-<​HTML>​ +Un script shell este un program scris într-un fișier text format din combinații de 
-  <​center>​ +comenzi și instrucțiuni specifice unui interepretor de comenzi (unui shell). 
-    <​iframe src="​https://​docs.google.com/​viewer?​url=http://​elf.cs.pub.ro/​uso/​res/​cursuri/​curs-05/​curs-05-handout.pdf&​embedded=true"​ width="​600"​ height="​480"​ style="​border:​ none;">​ +Shell-ul este un interpretor de comenzi care faciliteaza accesul utilizatorului la resursele sistemului de operare.
-    </​iframe>​ +
-  </​center>​ +
-</​HTML>​+
  
-*/+Cum arată un script shell: 
 +<​code>​ 
 +#!/bin/bash 
 +echo Noi suntem banul si stema 
 +</​code>​
  
 +  * Ce înseamnă ''#​!/​bin/​bash?''​
 +Secvența de caractere (''​shebang''​) care este prezentă tot timpul la începutul unui script și care indică interpretorul scriptului (în exemplul dat fiind shell-ul Bash).
  
-===== Demo =====+  * Cum creăm și rulăm un script? 
 +Putem deschide command line-ul, creăm un fișier cu extensia ''​.sh''​ (good practice), pe care ulterior îl edităm folosind orice editor text (vim, Sublime etc.), căruia ulterior trebuie sa îi dăm drepturi de execuție (chmod pentru a schimba și ls -l pentru verificare). La sfârșit, putem rula script-ul ca pe orice executabil. 
 +<​code>​ 
 +student@uso:​~/​Documents$ vi script.sh 
 +student@uso:​~/​Documents$ chmod +x script.sh 
 +student@uso:​~/​Documents$ ls -l script.sh 
 +-rwxr-xr-x 1 student student 44 nov  3 17:06 script.sh ​  
 +student@uso:​~/​Documents$ ./​script.sh 
 +Noi suntem banul si stema 
 +</​code>​
  
-==== Variabila PATH ====+  * De ce shell scripting?​ 
 +Script-urile oferă posibilitatea de automatizare a sarcinilor putând utiliza o serie mai mare de comenzi laolaltă. De asemenea, structurile repetitive (for, while) și cele decizionale (if, else) pot fi implementate ușor folosind shell scripting. Operatorii logici sunt și ei des folosiți pentru a înlănțui mai multe comenzi, la fel ca și pipe-urile (“|”) - folosite pentru a folosi output-ul unei comenzi în comanda următoare.
  
-Dacă rulați în terminal comanda: 
-<​code>​echo $PATH</​code>​ 
-Veți vedea o listă de directoare de genul: 
-<​code>/​home/​student/​.local/​share/​umake/​bin:/​home/​student/​.local/​bin:/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin:/​usr/​games:/​usr/​local/​games:/​snap/​bin:/​usr/​lib/​jvm/​java-8-oracle/​bin:/​usr/​lib/​jvm/​java-8-oracle/​db/​bin:/​usr/​lib/​jvm/​java-8-oracle/​jre/​bin</​code>​ 
-Dacă puneți un executabil în oricare din aceste directoare, nu mai este nevoie să setați calea către executabil și puteți să îl rulați direct ca o comandă, folosind numele executabilului. 
  
-==== Globbing ====+Mai jos este un demo cu comenzile cele mai folosite pentru shell scripting și pentru a automatiza lucrul în linia de comandă.
  
 +==== Comanda grep ====
 +Comanda grep extrage liniile care conțin o expresie regulata dată dintr-un fișier.
 <​code>​ <​code>​
-student@myPc:~/USO/testls +student@uso:~/Documentscat cap_si_pajura | grep frate 
-endian.c  endian.o ​ hello  hello.c ​ Makefile ​ socket.c ​ struct.c ​ struct.o +Am fost frate pentru fratex2 
-student@myPc:​~/​USO/​test$ ls *.c +Ca nu e si fratele tau 
-endian.c  hello.c ​ socket.c ​ struct.c +Am fost frate pentru fratex2 
-student@myPc:​~/​USO/​test$ ls end?an.c +Am fost frate pentru fratex2
-endian.c +
-student@myPc:​~/​USO/​test$ ls [a-s]*.c +
-endian.c ​ hello.c ​ socket.c ​ struct.c +
-student@myPc:​~/​USO/​test$ ls *.{c,o} +
-endian.c ​ endian.o ​ hello.c ​ socket.c ​ struct.c ​ struct.o+
 </​code>​ </​code>​
  
-Mai sus avem câteva exemple de rulare a comenzii ls impreună cu expresii regulate.+==== Comenzile head și tail ==== 
 +Comenzile head si tail sunt folosite pentru afișarea primelor/​ultimelor linii sau caractere dintr-un input
  
-Ce reprezintă fiecare operator? +<​code>​ 
-  * ***:** 0 sau mai multe caractere +student@uso:~/​Documents$ cat cap_si_pajura | grep frate | head -2 
-  * **+:** 1 sau mai multe caractere +Am fost frate pentru frate. x2 
-  * **?:** 0 sau 1 caracter +Ca nu e si fratele tau 
-  * **[a-s]:** orice literă de la "​a"​ la "​s"​ +student@uso:~/​Documents$ cat himalaya | grep bani | tail -3 
-  * **[A-Za-z]:** orice literămică sau mare +Tot aşa găsesc eu banii şi în vârful munţilor. 
-  * **{c,o}:** c sau o+Eu fac bani şi-n Himalaya 
 +Unde fac eu bani pacheteduşmanii culeg doar pietre… 
 +</​code>​
  
-==== Escapări ==== 
  
 +==== Comanda seq ====
 +Comanda seq este folosită pentru a genera o secvență de numere.
 +Flagul -s este folosit pentru a stabili caracterul care delimitează numerele. Delimitatorul implicit este ‘\n’.
 <​code>​ <​code>​
-student@myPc:~/USO/testls -l +student@uso:~$ seq 4 
-total 0 +
--rw-r--r-- ​student student 0 nov  8 17:41 'ana are mere.txt'​ +2 
--rw-r--r-- 1 student student 0 nov  8 17:18  endian.c +3 
--rw-r--r-- 1 student student 0 nov  8 17:18  endian.o +4 
--rw-r--r-- 1 student student 0 nov  8 17:00  hello +student@uso:~$ seq -s " " ​1 2 5 
--rw-r--r-- 1 student student 0 nov  8 17:00  hello.c +1 3 5
--rw-r--r-- 1 student student 0 nov  8 17:00  Makefile +
--rw-r--r-- 1 student student 0 nov  8 17:01  socket.c +
--rw-r--r-- 1 student student 0 nov  8 17:00  struct.c +
--rw-r--r-- 1 student student 0 nov  8 17:01  struct.o +
-student@myPc:~/USO/testls ana are mere.txt +
-ls: cannot access '​ana':​ No such file or directory +
-ls: cannot access '​are':​ No such file or directory +
-ls: cannot access '​mere.txt':​ No such file or directory +
-student@myPc:​~/​USO/​test$ la "ana are mere.txt+
-'ana are mere.txt'​ +
-student@myPc:​~/​USO/​test$ ls 'ana are mere.txt'​ +
-'ana are mere.txt'​ +
-student@myPc:​~/​USO/​test$ ls ana\ are\ mere.txt +
-'ana are mere.txt'​+
 </​code>​ </​code>​
  
 +În comanda de mai sus 1 reprezintă numarul de la care pornim numărătoarea,​ 2 este incrementul,​ iar 5 este numărul la care ne oprim.
 +Opțiunea -f este folosită pentru a afișa secvența într-un anumit format.
 <​code>​ <​code>​
-student@myPc:~/USO/testecho "Hello World+student@uso:~$ seq -f "Star Wars Episode %01g" ​3 
-Hello World +Star Wars Episode 1 
-student@myPc:​~/​USO/​test$ echo Hello World +Star Wars Episode 2 
-Hello World +Star Wars Episode 3 
-student@myPc:~/USO/testecho "Hello \"​World\""​ +student@uso:~$
-Hello "​World"​ +
-student@myPc:​~/​USO/​test$ echo "Hello "​World""​ +
-Hello World+
 </​code>​ </​code>​
  
 +==== Comanda cut ====
 +Comanda cut este folosită pentru a tăia aceeași secțiune din fiecare linie a unui input și a afișa aceste părți ale liniilor.
 +De exemplu, pentru următorul fișier vrem să afișăm doar numele filmelor, nu și anul în care a avut loc premiera fiecăruia.
 <​code>​ <​code>​
-student@myPc:~/USO/testecho \" +student@uso:~$ cat asok.txt 
-" +Inception 2010 
-student@myPc:~/USO/testecho ""​ +Parasite 2019 
- +Se7en 1995 
-student@myPc:~/USO/testecho \"​\"​ +Goodfellas 1990 
-""​+Gladiator 2000 
 +Alien 1979 
 +student@uso:~$ cut -d " " ​-f 1 asok.txt 
 +Inception 
 +Parasite 
 +Se7en 
 +Goodfellas 
 +Gladiator 
 +Alien 
 +student@uso:~$
 </​code>​ </​code>​
  
-<​note>​Pentru ca un caracter special ​să fie utilizat ca un caracter obișnuit în bashel trebuie să fie escapat.</​note>​ +Opțiunea ''​-f''​ se folosește pentru a selecta ce coloane din input vrem să fie afișateiar opțiunea ''​-d''​ definește delimitatorul dintre coloane.
- +
-==== Expandări ====+
  
 +==== Comanda sed ====
 +Comanda sed se poate folosi cu mai multe scopuri, sed fiind un stream editor avansat. Se folosește în principal pentru inserții sau șteregere de caractere într-un input.
 <​code>​ <​code>​
-student@myPc:~/​USO/​test/​filestouch $(seq -f "​file-%02g.txt" 1 20) +student@uso:~$ cat text.txt 
-student@myPc:​~/​USO/​test/​files$ touch file.txt +Noi ştim că unu ori unu fac unu, 
-student@myPc:~/USO/test/files$ ls +dar un inorog ori o pară 
-file-01.txt ​ file-04.txt ​ file-07.txt ​ file-10.txt ​ file-13.txt ​ file-16.txt ​ file-19.txt +nu ştim cât face. 
-file-02.txt ​ file-05.txt ​ file-08.txt ​ file-11.txt ​ file-14.txt ​ file-17.txt ​ file-20.txt +Ştim că cinci fără patru fac unu, 
-file-03.txt  file-06.txt ​ file-09.txt ​ file-12.txt ​ file-15.txt ​ file-18.txt ​ file.txt +dar un nor fără o corabie 
-student@myPc:​~/​USO/​test/​files$ rm -rf $(seq -"​file-%02g.txt" 1 20) +nu ştim cât face
-student@myPc:~/​USO/​test/​filesls +student@uso:~$ sed 's/unu/bani/' text.txt 
-file.txt+Noi ştim că bani ori unu fac unu, 
 +dar un inorog ori o pară 
 +nu ştim cât face
 +Ştim că cinci fără patru fac bani, 
 +dar un nor fără o corabie 
 +nu ştim cât face
 +student@uso:~$
 </​code>​ </​code>​
  
 +În exemplul de mai sus, prima apariție de pe fiecare linie a cuvântului “unu” este înlocuită cu “bani”. Caracterul s care vine imediat după sed indică operația care se face pe input (substitution).
 +
 +Mai jos sunt schimbate toate aparițiile cuvântului “unu”. ​
 <​code>​ <​code>​
-student@myPc:~/​USO/​test/​filesa=6 +student@uso:~$ sed 's/unu/bani/g' text.txt 
-student@myPc:​~/USO/test/files$ echo a +Noi ştim că bani ori bani fac bani, 
-a +dar un inorog ori o pară 
-student@myPc:​~/​USO/​test/​files$ echo $a +nu ştim cât face. 
-6 +Ştim că cinci fără patru fac bani, 
-student@myPc:~/​USO/​test/​filesecho $((a)) +dar un nor fără o corabie 
-+nu ştim cât face. 
-student@myPc:​~/USO/​test/​files$ a+++student@uso:~$ 
 +</code>
  
-Command 'a++' not found, did you mean:+Comanda se poate folosi și pentru ​șterge linii din input.
  
-  command '​a+'​ from deb aplus-fsf +<​code>​ 
-  ​command ​'g++' ​from deb g++ +student@uso:​~$ sed '3d' ​text.txt 
-  ​command 'c++' from deb g++ +Noi ştim că unu ori unu fac unu, 
-  ​command '​c++'​ from deb clang +dar un inorog ori o pară 
-  ​command 'c++' from deb libc++-helpers +Ştim că cinci fără patru fac unu, 
-  ​command '​c++'​ from deb pentium-builder +dar un nor fără o corabie 
-  ​command '​ac++'​ from deb aspectc++ +nu ştim cât face. 
-  ​command '​ag++'​ from deb aspectc+++</​code>​
  
-Try: sudo apt install <deb name>+Comanda de mai sus șterge a treia linie. 
 +Mai jos se șterge linia care conține secvența de caractere “cinci”.
  
-student@myPc:~/​USO/​test/​files((a++)) +<​code>​ 
-student@myPc:​~/USO/test/files$ echo $a +student@uso:~$ sed '/cinci/d' text.txt 
-7 +Noi ştim că unu ori unu fac unu, 
-student@myPc:​~/​USO/​test/​files$ b=$((a-4)) +dar un inorog ori o pară 
-student@myPc:​~/​USO/​test/​files$ echo $b +nu ştim cât face. 
-3+dar un nor fără o corabie 
 +nu ştim cât face.
 </​code>​ </​code>​
  
- +Folosind regex-uri, putem face pattern matching destul de ușor folosind această comandă. 
-==== cat și redirectarea ====+De exemplu, comanda de mai jos șterge linia care conține string-ul “nu” la începutul unui șir.  ​
  
 <​code>​ <​code>​
-student@myPc:~/​USO/​test/​filesecho Ana are mere > test.txt +student@uso:~$ sed '/^nu/d' text.txt 
-student@myPc:​~/USO/test/files$ cat test.txt +Noi ştim că unu ori unu fac unu, 
-Ana are mere +dar un inorog ori o pară 
-student@myPc:​~/​USO/​test/​files$ echo "Ana are mere 2" >> test.txt +Ştim că cinci fără patru fac unu, 
-student@myPc:~/​USO/​test/​filescat test.txt +dar un nor fără o corabie 
-Ana are mere +student@uso:~$
-Ana are mere 2+
 </​code>​ </​code>​
 +
 +==== Comanda wc ====
 +Comanda wc este folosită pentru a număra liniile, cuvintele sau carcterele dintr-un input.
  
 <​code>​ <​code>​
-student@myPc:~/​USO/​test/​filesid student &> /dev/null && echo "​da"​ || echo "​nu"​ +student@uso:~$ cat yossa 
-da +Can you live without answers? All of you, ask that of yourself. Can you live without answers? 
-student@myPc:~/​USO/​test/​filesid student &> /dev/null && echo "​da"​ || echo "​nu"​ +Because if you cannot, then most assuredly you will invent your own answers and they will comfort 
-nu+you. And all those who do not share your view will by their very existence strike fear and hatred 
 +into your heart. 
 +student@uso:~$ wc yossa 
 +  ​4 ​ 56 307 yossa
 </​code>​ </​code>​
  
 +4 este numărul de linii, 56 este numărul de cuvinte, iar 307 este numărul de caractere.
 +
 +==== for, while, if, else ====
  
-==== tacrev și nl ====+Înainte de a prezenta aceste instrucțiunitrebuie să înțelegem ce presupune folosirea caracterului ''​$''​ in niște situații.
  
 +''​$(command)''​ - se înlocuiește cu output-ul comenzii “command”
 <​code>​ <​code>​
-student@myPc:~/​USO/​test/​files$ echo "Ana are mere 2" >> test.txt +student@uso:~$ echo Output-ul este $(echo acesta) 
-student@myPc:~/​USO/​test/​filesls +Output-ul este acesta 
-test.txt +student@uso:~$ 
-student@myPc:​~/​USO/​test/​filestac test.txt +</​code>​ 
-Ana are mere 2 +''​$(var)''​ - valoarea ce se găsește în variabila var 
-Ana are mere +<​code>​ 
-student@myPc:~/​USO/​test/​filescat test.txt +student@uso:~$ a=5 
-Ana are mere +student@uso:~$ echo $a 
-Ana are mere 2 +5 
-student@myPc:~/​USO/​test/​filesrev test.txt +student@uso:~$
-erem era anA +
-2 erem era anA +
-student@myPc:~/​USO/​test/​filesnl test.txt +
-     1 Ana are mere +
-     2 Ana are mere 2+
 </​code>​ </​code>​
  
-<​note>​ +==== Instructiunea if ==== 
-  * cat → afișeaza conținutul fișierului +Sintaxa lui if este următoarea:​
-  * tac → afișeaza conținutul fișierului în ordinea inversă a liniilor +
-  * rev → afișeaza liniile inversate (primul element de pe linie devine ultimul) +
-  * nl → afișeaza numărul liniei +
-</​note>​ +
- +
-==== head și tail ====+
  
 <​code>​ <​code>​
-student@myPc:​~/​USO/​test/​files$ cat test.txt +if [ conditie ] 
-Ana are mere +then 
-Ana are mere 2 +   comenzi 
-Ana are mere 3 +fi
-Maria are pere +
-Ana are mere +
-student@myPc:​~/​USO/​test/​files$ cat test.txt | head -n 2 +
-Ana are mere +
-Ana are mere 2 +
-student@myPc:​~/​USO/​test/​files$ cat test.txt | tail -n 2 +
-Maria are pere +
-Ana are mere+
 </​code>​ </​code>​
 +Pe lângă aceasta mai putem avea și if-else sau if-elif-else-fi spre exemplu
 +<​code>​
 +if [ conditie ]
 +then
 +   ​comenzi pentru conditie true
 +else
 +   ​comenzi pentru conditie false
 +fi
 +</​code>​
 +<​code>​
 +if [ conditie1 ]
 +then
 +   ​comenzi pentru conditie1 true
 +elif [ conditie2 ]
 +then
 +   ​comenzi pentru conditie2 true
 +else
 +   ​comenzi pentru conditie2 false
 +fi
 +</​code>​
 +Mai jos este un exemplu de folosire a unui if într-un script. Sintaxele diferite de mai sus funcționează la fel ca cele pe care le știm de la programare. În schimb, condițiile sunt cele care necesită un plus de atenție.
  
-<note+<code
-  * head -n 2 → afișează primele 2 linii din fisier +#!/bin/bash
-  * tail -n 2 → afișează ultimele 2 linii din fisier +
-</note>+
  
-==== sort, uniq și wc ====+a=
 +b=
 +if [[ $a -eq $b ]] 
 +then 
 + echo "​Numerele sunt egale"​ 
 +elif [[ $a -gt $b ]];  
 +then 
 + echo "a mai mare decat b" 
 +else 
 + echo "b mai mare decat a" 
 +fi
  
-<​code>​ +student@uso:~$ ./script.sh 
-student@myPc:~/​USO/​test/​filescat test.txt +b mai mare decat a 
-Ana are mere +student@uso:~$
-Ana are mere 2 +
-Ana are mere 3 +
-Maria are pere +
-Ana are mere +
-student@myPc:​~/USO/​test/​files$ sort test.txt +
-Ana are mere +
-Ana are mere +
-Ana are mere 2 +
-Ana are mere 3 +
-Maria are pere +
-student@myPc:~/​USO/​test/​filessort -r -n test.txt +
-Maria are pere +
-Ana are mere 3 +
-Ana are mere 2 +
-Ana are mere +
-Ana are mere +
-student@myPc:​~/​USO/​test/​files$ wc test.txt +
- 5 17 71 test.txt +
-student@myPc:​~/​USO/​test/​files$ wc -c test.txt +
-71 test.txt +
-student@myPc:​~/​USO/​test/​files$ wc -l test.txt +
-5 test.txt +
-student@myPc:​~/​USO/​test/​files$ sort test.txt > test22.txt +
-student@myPc:​~/​USO/​test/​files$ cat test22.txt +
-Ana are mere +
-Ana are mere +
-Ana are mere 2 +
-Ana are mere 3 +
-Maria are pere +
-student@myPc:​~/​USO/​test/​files$ uniq test22.txt +
-Ana are mere +
-Ana are mere 2 +
-Ana are mere 3 +
-Maria are pere+
 </​code>​ </​code>​
  
-<​note>​ +Instrucțiunile for și while pot fi folosite atât în cadrul terminalului în comenzi, cât și în script-uri. 
-  * sort → sortează intrările +Mai jos este un exemplu cu loop-ul for folosit într-o comandă
-  * uniq → elimină duplicatele din fișier +
-  * wc → numară elementele din fisier +
-</​note>​+
  
-==== cut și tr ====+<​code>​ 
 +student@uso:​~$ for v in $(seq 1 4); do echo linia $v; done 
 +linia 1 
 +linia 2 
 +linia 3 
 +linia 4 
 +</​code>​ 
 +For poate fi folosit si intr-un script. 
 +<​code>​ 
 +student@uso:​~$ cat script.sh 
 +#!/bin/bash
  
-<​code>​student@myPc:​~/​USO/​test$ ls -l +a=0; 
-total 4 +for v in $(seq 4) 
--rw-r--r-- 1 student student ​   ​nov  8 17:41 'ana are mere.txt'​ +do 
--rw-r--r-- ​student student ​   0 nov  8 17:18  endian.c + a=$(($a + $v)); 
--rw-r--r-- 1 student student ​   0 nov  8 17:18  endian.o +done 
-drwxr-xr-x 2 student student 4096 nov  8 18:36  files +echo $a; 
--rw-r--r-- 1 student student ​   0 nov  8 17:00  hello +student@uso:~$ ./script.sh 
--rw-r--r-- 1 student student ​   0 nov  8 17:00  hello.c +10 
--rw-r--r-- 1 student student ​   0 nov  8 17:00  Makefile +student@uso:~$
--rw-r--r-- 1 student student ​   0 nov  8 17:01  socket.c +
--rw-r--r-- 1 student student ​   0 nov  8 17:00  struct.c +
--rw-r--r-- 1 student student ​   0 nov  8 17:01  struct.o +
-student@myPc:~/USO/testls -l | tr -d '.+
-total 4 +
--rw-r--r-- 1 student student ​   0 nov  8 17:41 ana are meretxt +
--rw-r--r-- 1 student student ​   0 nov  8 17:18 endianc +
--rw-r--r-- 1 student student ​   0 nov  8 17:18 endiano +
-drwxr-xr-x 2 student student 4096 nov  8 18:36 files +
--rw-r--r-- 1 student student ​   0 nov  8 17:00 hello +
--rw-r--r-- 1 student student ​   0 nov  8 17:00 helloc +
--rw-r--r-- 1 student student ​   0 nov  8 17:00 Makefile +
--rw-r--r-- 1 student student ​   0 nov  8 17:01 socketc +
--rw-r--r-- 1 student student ​   0 nov  8 17:00 structc +
--rw-r--r-- 1 student student ​   0 nov  8 17:01 structo +
-student@myPc:​~/USO/test$ ls -l | tr -d ' ' +
-total4 +
--rw-r--r--1studentstudent0nov817:​41anaaremere.txt +
--rw-r--r--1studentstudent0nov817:​18endian.c +
--rw-r--r--1studentstudent0nov817:​18endian.o +
-drwxr-xr-x2studentstudent4096nov818:​36files +
--rw-r--r--1studentstudent0nov817:​00hello +
--rw-r--r--1studentstudent0nov817:​00hello.c +
--rw-r--r--1studentstudent0nov817:​00Makefile +
--rw-r--r--1studentstudent0nov817:​01socket.c +
--rw-r--r--1studentstudent0nov817:​00struct.c +
--rw-r--r--1studentstudent0nov817:​01struct.o +
-student@myPc:~/USO/testls -l | tr -d '​-'​ +
-total 4 +
-rwrr 1 student student ​   0 nov  8 17:41 ana are mere.txt +
-rwrr 1 student student ​   0 nov  8 17:18 endian.c +
-rwrr 1 student student ​   0 nov  8 17:18 endian.o +
-drwxrxrx 2 student student 4096 nov  8 18:36 files +
-rwrr 1 student student ​   0 nov  8 17:00 hello +
-rwrr 1 student student ​   0 nov  8 17:00 hello.c +
-rwrr 1 student student ​   0 nov  8 17:00 Makefile +
-rwrr 1 student student ​   0 nov  8 17:01 socket.c +
-rwrr 1 student student ​   0 nov  8 17:00 struct.c +
-rwrr 1 student student ​   0 nov  8 17:01 struct.o+
 </​code>​ </​code>​
 +Script-ul de mai sus afișează suma numerelor de la 1 la 4.
 +În același mod poate fi folosit și while:
 +<​code>​
 +#!/bin/bash
  
-<​code>​student@myPc:​~/​USO/​test/​filescat test.txt +i=0; 
-Ana are mere +while [ $i -le ] 
-Ana are mere 2 +do 
-Ana are mere +   echo ​$i 
-Maria are pere +     i=$(($i+1)) 
-Ana are mere +done
-student@myPc:​~/​USO/​test/​filescat test.txt | cut -d' ' -f1 +
-Ana +
-Ana +
-Ana +
-Maria +
-Ana +
-student@myPc:​~/​USO/​test/​filescat test.txt | cut -d' ' -f1,3 +
-Ana mere +
-Ana mere +
-Ana mere +
-Maria pere +
-Ana mere+
 </​code>​ </​code>​
  
-<note+Script-ul afișează valorile de la 0 la 3 
-  * tr → elimină caractere +<code
-  * cut → afișeaza doar liniile pe care le m de la tastatură +student@uso:​~$ ./script.sh 
-</note>+
 +
 +
 +
 +student@uso:​~$ 
 +</​code>​ 
 +Mai jos avem un script ​care pune la sfârșitul liniilor pare dintr-un text un string: 
 +<​code>​ 
 +#​!/​bin/​bash 
 + 
 +nr_linii=$(wc -l text.txt | cut -" " -f 1) 
 +i=0 
 +while [ $i -le $nr_linii ] 
 +do 
 +    if [[ $(($i%2)) -eq 0 && $i -gt 0 ]] 
 +    then 
 +    sed -i "$i s/$/ yeah/" text.txt 
 +    fi 
 +    i=$(($i+1)) 
 +done 
 +</​code>​ 
 +Se observă că acest script folosește atât un while, cât și un if, precum și comanda sed. 
 +<​code>​ 
 +student@uso:​~$ cat text.txt 
 +California, rest in peace 
 +Simultaneous release 
 +California, show your teeth 
 +She's my priestess 
 +I'm your priest 
 +student@uso:​~$ ./​script.sh 
 +student@uso:​~$ cat text.txt 
 +California, rest in peace 
 +Simultaneous release yeah 
 +California, show your teeth 
 +She's my priestess yeah 
 +I'm your priest 
 +student@uso:​~$ 
 +</code>
uso/cursuri/curs-06.1664821115.txt.gz · Last modified: 2022/10/03 21:18 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0