Unelte utilizator

Unelte site


baza_shell_scripting

Diferențe

Aceasta arată diferențele dintre revziile selectate și versiunea curentă a paginii.

Link către această vizualizare comparativă

baza_shell_scripting [2008/05/31 20:09] (curent)
Linia 1: Linia 1:
 +====== 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):
 +<​code>​ls</​code>​
 +<​code>​ls -l</​code>​
 +<​code>​ls -a</​code>​
 +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:
 +<​code>​
 +#!/bin/bash
 +ls
 +ls -l
 +ls -a
 +</​code>​
 +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:
 +<​code>​
 +#!/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.
 +</​code>​
 +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:
 +<​code>​
 +#!/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"​
 +</​code>​
 +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 [[http://​tldp.org/​LDP/​abs/​abs-guide.pdf|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ă)