Unelte utilizator

Unelte site


baza_shell_scripting

Shell scripting

1. Notiuni introductive

Cu toţii ştiţi probabil cum funcţionează consola Linux. Dacă nu, să vorbim puţin despre asta. Atunci când daţi comanda „Run program“, şi scrieţi „konsole“, sau mergeti in meniul Mandriva şi alegeţi un terminal, se deschide de fapt un program care trimite comenzile pe care le tastati interpretorului de comenzi. Sunt numeroase interpretoare de comenzi, dar în mod uzual veţi folosi bash, sh sau csh.

În mod normal, interpretorul (să presupunem ca folosim bash) preia comenzile de la tastatura. Însă limita sa nu se opreste aici. Mai mult, el poate prelua comenzile dintr-un fişier text. Asta aduce aminte de fişiere .BAT din DOS (care încă se mai găsesc in Windows XP - vezi, de exemplu, AUTOEXEC.BAT).

Ba mai mult, shell-ul Linux se comportă ca un limbaj de programare. O să aflaţi despre asta puţin mai încolo. Ce-i drept, e destul de rudimentar, însă shell-ul e facut sa interpreteze comenzi, nu sa dezvolte programe complexe. :-P

2. Exemple concrete

Să zicem că sunt un expert in Linux, care vrea să explice unor novici diferenta între mai multe feluri de a folosi comanda ls. Pentru asta, pot să folosesc următoarele comenzi (acestea se scriu de la tastatura, una după alta):

ls
ls -l
ls -a

Destul de simplu până aici. Însă ce mă fac dacă am mai mulţi asemenea novici într-o zi? Nu îmi convine să scriu atâtea comenzi pentru fiecare. Nu aş putea sa „grupez“ comenzile astea într-una? Da, se poate - folosesc un script. Creez un fişier oarecare, să zicem că îi dau numele demo-ls. Îl editez folosind un oarecare editor de texte, şi scriu în el liniile următoare:

#!/bin/bash
ls
ls -l
ls -a

Prima linie semnifică interpretorul de comenzi (în caz că e nevoie), apoi cele trei comenzi ls. Făcând fişierul acesta executabil (chmod +x demo-ls) şi rulându-l (./demo-ls sau bash demo-ls), avem acelaşi efect ca mai înainte. Însă e o problemă. Dacă sunt mai multe fişiere, output-urile lor nu se prea văd. Nu aş putea să afişez un mic text înainte de fiecare, şi să ruleze urmatoarea comandă ls dupa ce apăs ENTER? Eventual să şteargă ecranul după fiecare comandă? Da, se poate. Edităm fişierul, şi îl facem să arate aşa:

#!/bin/bash
clear
echo Apasati ENTER pentru a vedea comanda ls fara nici un paramentru:
read
ls
echo Apasati ENTER pentru a vedea comanda ls -l:
read
clear
ls -l
echo Apasati ENTER pentru a vedea comanda ls -a:
read
clear
ls -a
echo Demonstratie terminata.

De aici se observă prima utilizare a script-urilor. Când avem de-a face cu mai multe comenzi, se poate face o prezentare mult mai buna a lor. În plus, totul se face mai repede. Cum ar fi fost daca am fi „şters“ ecranul după fiecare comandă ls?

3. Programare in shell

În plus, scripturile sunt folositoare pentru lucruri mai complicate într-un sistem Linux. Să zicem că rulez un server web (http), şi, ca administrator de sistem, vreau să ved câţi dintre utilizatorii mei au o pagină pe server. Un mod simplu ar fi să intru în directoarele lor (public_html sau www) şi să îmi dau seama singur. Dar cum fac dacă am 100 de utilizatori? Acum, un script m-ar putea ajuta. Pot să preiau numele fiecaruia din /etc/passwd (folosind comanda cut), apoi pentru fiecare dintre ei să verific dacă există fişierul /home/$USER/public_html/index.html. Folosim variabile ($useri) şi for/if, ca într-un limbaj de programare (sintaxa este însă destul de diferită). Concret, asta ar arăta cam aşa:

#!/bin/bash
$useri=`cut --delimiter=: --fileds=1 /etc/passwd` # variabila $users va contine output-ul comenzii respective

touch nu_au.txt                                   # aici ii punem pe cei care nu au pagina

for [ $user in $users ]                           # pentru fiecare $user
do                                                # executa:
  if [ ! -x /home/$user/public_html/index.html ]  # daca nu exista fisierul cu pricina...
  then                                            # atunci
      echo $user >> nu_au.txt                     # il scriem in fisier
  fi                                              # sfarsitul lui "if"
done                                              # sfarsitul lui "for"

Se observă acum complexitatea acestui tip de script. Avem variabile, for şi if, ca într-un limbaj de programare obişnuit. Şi, asa cum vă daţi seama, shell-ul poate fi folosit pentru programe rudimentare (ca generarea şirului lui Fibonacci, chiar şi backtracking recursiv :-P). De asemenea, posibilităţile pe care le oferă shell-ul sunt mult mai multe.

4. De unde aflu mai multe?

Recomand acest imens pdf. Din el am învăţat şi eu ce ştiu.

Articol scris de Halip Ilie, 11 noiembrie 2006

baza_shell_scripting.txt · Ultima modificare: 2008/05/31 20:09 (editare externă)