1) Introducere - fisier text (script) in care apar comenzile ce trebuie executate ( editare cu: vim, nano, joe, ...) - pentru a putea rula, scriptul trebuie sa fie marcat cu dreptul de executie (chmod +x) - interpretarea si rularea fiecarei comenzi se face de catre un interpretor specificat pe prima linie a scriptului #!/bin/bash sau #!/bin/sh sau ... - comentariile pot fi introduse cu ajutorul caracterului # - Exemplu: #!/bin/bash # Classic hello world stuff echo Hello world 2) Variabile - declararea se face fara a specifica tipul - o variabila poate contine: un numar, un caracter, un sir de caractere - nu trebuie declarate in prealabil; atribuirea unei valori este suficienta pentru a introduce variabila in script - exemplu: #!/bin/bash helloStr="Hello world" echo $helloStr todayDate=$(date +%Y%m%d) echo Today is $todayDate echo Your folder content is: echo $(ls -l) 3) Structuri de control - IF - executa anumite comenzi in functie de evaluarea unei expresii la o valoare de adevar - forme de invocare: - if [expresie]; then <comenzi> fi - if [expresie]; then <comenzi> else <comenzi> fi - expresia evaluata poate fi o expresie custom, una din expresiile standard sau o combinatie - expresii standard: [ -a FILE ] True if FILE exists. [ -b FILE ] True if FILE exists and is a block-special file. [ -c FILE ] True if FILE exists and is a character-special file. [ -d FILE ] True if FILE exists and is a directory. [ -e FILE ] True if FILE exists. [ -f FILE ] True if FILE exists and is a regular file. [ -g FILE ] True if FILE exists and its SGID bit is set. [ -h FILE ] True if FILE exists and is a symbolic link. [ -k FILE ] True if FILE exists and its sticky bit is set. [ -p FILE ] True if FILE exists and is a named pipe (FIFO). [ -r FILE ] True if FILE exists and is readable. [ -s FILE ] True if FILE exists and has a size greater than zero. [ -t FD ] True if file descriptor FD is open and refers to a terminal. [ -u FILE ] True if FILE exists and its SUID (set user ID) bit is set. [ -w FILE ] True if FILE exists and is writable. [ -x FILE ] True if FILE exists and is executable. [ -O FILE ] True if FILE exists and is owned by the effective user ID. [ -G FILE ] True if FILE exists and is owned by the effective group ID. [ -L FILE ] True if FILE exists and is a symbolic link. [ -N FILE ] True if FILE exists and has been modified since it was last read. [ -S FILE ] True if FILE exists and is a socket. [ FILE1 -nt FILE2 ] True if FILE1 has been changed more recently than FILE2, or if FILE1 exists and FILE2 does not. [ FILE1 -ot FILE2 ] True if FILE1 is older than FILE2, or is FILE2 exists and FILE1 does not. [ FILE1 -ef FILE2 ] True if FILE1 and FILE2 refer to the same device and inode numbers. [ -o OPTIONNAME ] True if shell option "OPTIONNAME" is enabled. [ -z STRING ] True of the length if "STRING" is zero. [ -n STRING ] or [ STRING ] True if the length of "STRING" is non-zero. [ STRING1 == STRING2 ] True if the strings are equal. "=" may be used instead of "==" for strict POSIX compliance. [ STRING1 != STRING2 ] True if the strings are not equal. [ STRING1 < STRING2 ] True if "STRING1" sorts before "STRING2" lexicographically in the current locale. [ STRING1 > STRING2 ] True if "STRING1" sorts after "STRING2" lexicographically in the current locale. [ ARG1 OP ARG2 ] "OP" is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if "ARG1" is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to "ARG2", respectively. "ARG1" and "ARG2" are integers. - expresii combinate: [ ! EXPR ] True if EXPR is false. [ ( EXPR ) ] Returns the value of EXPR. This may be used to override the normal precedence of operators. [ EXPR1 -a EXPR2 ] True if both EXPR1 and EXPR2 are true. [ EXPR1 -o EXPR2 ] True if either EXPR1 or EXPR2 is true. - example: #!/bin/bash if [ $1 = "ls"]; then echo will show the content of $1; ls fi - Loops - exista urmatoarele tipuri de bucle: - for - itereaza o serie de 'cuvinte' / 'elemente' dintr-un sir - while - executa o secventa de instructiuni atata timp cat expresia de control este adevarata sau se forteaza o iesire explicita - until - executa o secventa de instructiuni atata timp cat expresia de control este falsa sau se forteaza o iesire explicita - executia naturala a buclei poate fi alterata folosind: - continue - abandoneaza procesarea iteratiei curente si continua cu urmatoarea iteratie - break - abandoneaza complet procesarea buclei si continua cu urmatoarea instructiune de dupa bucla - for: - sintaxa: for VARIABLE in 1 2 3 4 5 .. N do command1 command2 commandN done for VARIABLE in file1 file2 file3 do command1 on $VARIABLE command2 commandN done for OUTPUT in $(Linux-Or-Unix-Command-Here) do command1 on $OUTPUT command2 on $OUTPUT commandN done - itereaza 'elementele' dintr-un 'sir' #!/bin/bash for i in $( ls ); do # sirul este format din outputul comenzii ls - toate fisierele si directoarele din locatia curenta echo item: $i done - exemplu (determina numarul de nameservers configurate pe sistem): #!/bin/bash for file in /etc/* # sirul/colectia = toate fisierele din folderul /etc do if [ "${file}" == "/etc/resolv.conf" ] then countNameservers=$(grep -c nameserver /etc/resolv.conf) echo "Total ${countNameservers} nameservers defined in ${file}" break fi done - DO-WHILE / UNTIL: - sintaxa: while [ condition ]; do command1 command2 command3 done - exemplu: #!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done #!/bin/bash COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done 4) Misc - input de la tastatura: - comanda: read - exemplu: #!/bin/bash echo Please, enter your name read NAME echo "Hi $NAME!" - evaluare expresii: - exemplu: echo 1 + 1 # nu va afisa 2 ci va afisa "1 + 1" echo $((1+1)) # evalueaza expresia si afiseaza rezultatul evaluarii echo $[1+1] # evalueaza expresia si afiseaza valoarea "logica" a evaluarii - capturarea outputului unui program: - se incadreaza apelul programului cu toata liniia lui de comandat intre caracterele: `` - exemplu: #!/bin/bash DBS=`mysql -uroot -e"show databases"` for b in $DBS ; do mysql -uroot -e"show tables from $b" done 5) Comenzi utile in scripturi si nu numai: - shift, read, readonly, sleep, exit, echo, test (echivalent cu "[ ..]"), export, expr, basename, (apostroafele inverse) - ls, pwd, cat, find, locate, file, more, less, rm, mkdir, rmdir, cp, mv, cd, chmod, chown, ln, touch, du, cut, sort, uniq, cmp, diff, head, tail, wc, split - finger, w, who, ps, last, id, users - netstat, ping, hostname, host, ftp, ftpwho - clear, date, mail, uptime, df, fg, bg 6) Practica: Sa se construiasca un fisier de comenzi care primeste ca parametru un nume de director (sa-l numim D) si un numar intreg (sa-l numim N). Pentru fiecare fisier din directorul D sau din subdireacoarele acestuia, pentru care userul are drepturi de citire si de executie, sa se afiseze (maximum) primele N linii.