Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Bourne shell - Variabilele si exportarea lor

calculatoare



+ Font mai mare | - Font mai mic



Bourne shell

Fisierul .profile

Fisierul  `.profile' este citit de shell-ul `/bin/sh' la pronire. Pe sistemele, la pornirea shell-ului este citit, de asemenea si fisierul  `/etc/profile'. Pe masinile `HPUX' este citit fisierul  `/etc/src.sh'



Variabilele si exportarea lor

Atat variabilele locale cat si cele globale sunt definite folosind sintaxa:

VARIABLA='Ceva'
VAR=13

Este important sa nu introduceti spatii intre numele variabilei si semnul egal. Implicit aceste variabile sunt locale. Pentru a le face globale (astfel incat procesele fiu ale shell-ului respectiv sa le mosteneasca) se foloseste comanda:

export VARIABLA

Aceasta comanda adauga variabila la mediul de executie al procesului (environment).
Comanda

set -a

face ca, implicit, toate variabilele sa fie create globale.

Tablourile sau listele de variabile sunt simulate prin siruri de caractere despartite de semnul ' . Exemplu:

PATH=/bin:/usr/bin:/etc:/local/bin:.

LD_LIBARAY_PATH=/usr/lib:/usr/openwin/lib:/local/lib

Pentru extragerea elementelor din lista se poate folosi comanda UNIX `cut'

Valoarea unei variabile:
Valoarea unei variabile este data de numele variabilei prefixat de simbolul $. Este posibila folosirea parantezelor rotunde. pentru a 'proteja' variabila de interferarea cu un alt text. De exemplu:

$ animal=worm  
$ echo book$animal
bookworm
$ thing=book
$ echo $thingworm
               (nimic..)
$ echo $worm
bookworm

Stdin, stdout and stderr

In Bourne shell, fisierele standard de intrare/iesire sunt referite prin numere si nu prin nume.

stdin Numar de fisier  0

stdout Numar de fisier  1

stderr Numar de fisier  2

Directionarea implicita a datelor spre aceste fisiere poate fi schimbata prin redirectare. Comenzile de redirectare sunt deosebit de flexibile in Bourne shell. Cateva exemple:

sh                Descriere

command > f         redirecteaza stdout in f 
command 1> f        redirecteaza stdout in f 
command 2> err      redirecteaza stderr in err 
command 1> f 2>&1           redirecteaza stdout si stderr in f  
command 1> f 2> err         redirecteaza stdout in f iar stderr in err

Operatii aritmetice in Bourne shell

Operatiile aritmetice in Bourne shell sunt realizate printr-un intermediul comenzii expr (sau folosind comanda bc). Iata cateva exemple folosind expr:

a=`expr $a+1`         # incrementeaza a
a=`expr 3 * 5+7`     # 3*5+7
verifica = `expr $a > $b`    # adevarat=1, fals=0. Adevarat daca $a > $b

Observatie: Comanda `expr'este foarte 'sensibila' la spatii si caractere backslash.

Scrierea unui script Bourne shell

Un script (sau o procedura) shell reprezinta un fisier ce contine comenzi sau macrocomenzi pe care shell-ul le citeste, interpreteaza si excuta. Scripturile pot fi lansate in executie in mai multe moduri:

1. $ chmod a+fisier    $ fisier

2. sh < fisier

3. sh fisier

Un fisier ce contine un script shell incepe de obicei cu secventa de caractere:

#!/bin/sh

Aceasta constructie este destul de generala: orice fisier executabil care incepe cu o secventa de tipul:

#!programulmeu -optiune

va determina shell-ul curent  sa incerce sa execute comanda

programulmeu -optiune numefisier

unde numefisier este numele respectivului fisier executabil.

Daca scriptul shell este lansat cu argumente in linia de comanda, acestea pot fi referite cu  ' este o variabila ce contine chiar numele scriptului.
 

Exemplu simplu

In continuare prezentam un exemplu simplu de script Bourne shell care isi tipareste toate argumentele. Daca acest script are numele 'exemplul1' si este lansat in executie astfel:

$ exemplul1 maria matei ionel

se va afisa pe ecran:

exemplul1 maria matei ionel Numarul total de argumente a fost 4

Iata continutul fisierului exemplul1:

#!/bin/sh

# Tipareste toate argumentele (exemplul 1)
for arg in $*
do
  echo Argument $arg
done

echo Numarul total de argumente a fost $#

Simbolul reprezinta intreaga lista de argumente iar este numarul total de argumente al liniei de comanda.
 

Comanda 'shift

Un alt mod de a realiza scriptul de mai sus este prin utilizarea comenzii `shift'.  Aceasta comanda sterge primul argument din lista de argumente si deplaseaza toate celelelte argumente la stanga, scazandu-le rangul cu un numar. Comanda `shift' este folosita la manipularea listelor lungi de argumente in Bourne shell.

#!/bin/sh

#  Tipareste toate argumentele (exemplul 2)


while ( true )
do
  arg=$1;
  shift;
  echo $arg a fost un argument;
  if [ $# -eq 0 ]; then
    break
  fi
done

Codul de revenire al unei comenzi

Toate programele care se executa in UNIX se termina cu o valoare intoarsa de functia  C 'return'. Exista o conventie ca o valoare de revenire nula (0) sa insemne ca respectivul program s-a executat cu succes iar orice alta valoare sa indice aparitia unei erori in executie. Codul de revenire este de obicei valoarea returnata in variabila externa de eroare C `errno'.

Scripturile shell pot testa aceasta valoare fie prin plasarea directa a comenzii intr-un test sau testand valarea variabilei  care contine codul de revenire al ultimei comenzi executate.
 

Comanda 'test'

Comanda 'test' testeaza indeplinirea unei conditii. Ea poate fi folosita pentru mai multe tipuri de teste:

test -f file

Adevarat daca file este un fisier obisnuit

test -d file

Adevarat daca file este un catalog

test -r file

Adevarat daca asupra lui file exista drept de citire (r)

test -w file

Adevarat daca asupra lui file exista drept de scriere (w)

test -x file

Adevarat daca asupra lui file exista drept de executie (x)

test -s file

Adevarat daca file contine ceva

test -g file

           Adevarat daca este setat bitul setgid pentru file

test -u file

           Adevarat daca este setat bitul setuid pentru file

test s1=s2

Adevarat daca sirurile de caractere s1 si s2 sunt egale

test s1!=s2

Adevarat daca sirurile de caractere s1 si s2 sunt diferite

test x -eq y

           Adevarat daca intregii x si y sunt egali

test x -ne y

          Adevarat daca intregii x si y nu sunt egali

test x -gt y

          Adevarat daca intregul x este mai mare decat intregul y

test x -lt y

          Adevarat daca intregul x este mai mic decat intregul y

test x -ge y

          Adevarat daca intregul x este mai mare sau egal decat intregul y

test x -le y

          Adevarat daca intregul x este mai mic sau egal decat intregul y

Operator logic NOT

-a

SI logic

-o

SAU logic

O sintaxa alternativa pentru a scrie aceste comenzi este sa folositi paranteze patrate in loc de cuvantul test. 

   [ $x -lt $y ]   '=='    test $x -lt $y

Structurile conditionale au urmatoarea sintaxa.

if comanda-unix
then
   comanda
else
   comenzi
fi

Clauza `else' este optionala. Dupa cum s-a observat anterior, prima prima comanda unix poate fi orice, de vreme ce fiecare comanda are un cod de retur. Rezultatul este TRUE daca conditia este evaluata la zero si fals altfel (spre deosebire de conventiile din majoritatea limbajelor). Teste multiple pot fi facute folosind

if comanda-unix
then
   comenzi
elif comanda-unix
then
   comenzi
elif comanda-unix
then
   comenzi
else
   comenzi
fi

unde `elif' inseamna `else-if'.

Echivalentul comenzii `switch' din C este mai mult asemanatoare structurii `case' din PASCAL.

case comanda-unix-sau-variabila in

   wildcard1) comenzi ;;
   wildcard2) comenzi ;;
   wildcard3) comenzi ;;

esac

Aceasta structura foloseste 'wildcards' pentru a fi comparate cu iesirea comenzii sau variabilei din prima linie. Primul sablon care se potriveste este executat.

Input de la utilizator in sh

In shell puteti citi valoarea unei variabile folosind comanda `read' cu sintaxa:

read variabila

Aceasta citeste un sir de la tastatura ce se termina la intilnirea CR/LF. Alta modalitate este folosirea comenzii `input' pentru a accesa un device logic anume. Device-ul tastaturii (pt. terminalul curent) este `/dev/tty', deci scrieti

variabila = `input < /dev/tty`

care citeste o singura linie de la tastatura (utilizator).

Iata citeva exemple de folosire a acestor comenzi. Mai intii un program care intreaba da sau nu

#!/bin/sh

# Da sau nu


echo 'Raspundeti da sau nu: '

answer=`line < /dev/tty` 

case $answer in

  d* | D* )  echo DA!! ;;

  n* | N* )            echo NU!! ;;

  *)           echo 'Sinteti chiar aurolac?'

esac

echo Gata

Observati cum se face 'pattern matching' si simbolul `OR'.

#!/bin/sh

# Kernel check


if test ! -f /vmunix          # Check that the kernel is there!
then
   echo 'This is not BSD unixhmmm'
   if [ -f /hp-ux ]
   then
      echo 'It's a Hewlett Packard machine!'
   fi
elif [ -w /vmunix ]
then
   echo 'HEY!! The kernel is writable my me!';
else
   echo 'The kernel is write protected.'
   echo 'The system is safe from me today.'
fi

Bucle in sh

In shell-ul Bourne buclele au urmatoarea sintaxa.

while comanda-unix
do
  comenzi
done

Prima comanda va fi mai mult ca sigur un test, dar in principiu poate sa fie orice comanda UNIX. Bucla `until', isi executa corpul pina cind argumentul sau este evaluat TRUE.

until comanda-unix
do
    comenzi
done

In final structura `for'

for variabila in lista
do
   comenzi
done

Adesea dorim sa folosim un vector de valori (de exemplu o lista for), dar shell-ul Bourne nu are vectori. Aceasta problema este de obicei rezolvata creind un sir lung separat de ':' spre exemplu. Astfel variabila $PATH are forma

PATH = /usr/bin:/bin:/local/gnu/bin

Shell-ul Bourne ne permite spargerea unui astfel de string la intilnirea oricarui caracter dorim. In mod normal sint cautate spatii, dar variabila `IFS' poate fi definita cu un inlocuitor. Pentru a face o bucla peste toate directoarele din PATH, vom scrie:

IFS=:

for name in $PATH; do

   comenzi

done

Iata citeva exemple:

#!/bin/sh

# Citire text de la tastatura


echo 'Clampaniti '

while read TEXT
do

   echo Ati tastat $TEXT

   if [ '$TEXT' = 'quit' ]; then
      echo '(Am terminat!)'
      exit 0
   fi

done

echo 'AJUTOR!'

Acesta e un script foarte simplu, exemplu tipic de folosire al buclei while. Preia text de la tastaura pina cind utilizatorul tasteaza 'quit'. Pentru ca read intoarce 'false' numai daca apare o eroare sau daca detecteaza un caracter EOF CTRL-D, nu se va termina niciodata fara o comanda `if' test. Daca primeste un semnal CTRL-D, scriptul tipareste `AJUTOR!'.

#!/bin/sh

# Watch in the background for a particular user
# and give alarm if he/she logs in

# To be run in the background, using &


if [ $# -ne 1 ]; then
  echo 'Give the name of the user as an argument' > /dev/tty
  exit 1
fi

echo 'Looking for $1'

until users | grep -s $1
do
   sleep 60
done

echo '!!! WAKE UP !!!' > /dev/tty
echo 'User $1 just logged in' > /dev/tty

Acest script foloseste `grep' in `silent mode' (-s option), adica nu scrie nimic la terminal. Unicul lucru care ne intereseaza este codul de retur furnizat de comenzile redirectate in pipe. Daca `grep' detecteaza o linie continind numele utilizatorului pe care il cautam, rezultatul este evaluat TRUE si bucla se termina.

Teme

  • Tema 1
    Sa se scrie un script Bourbe shell care inlocuieste comanda rm cu alta care nu sterge fisierele ci le muta intr-un director ascuns (numit .sterse). In plus va avea posibilitatea sa stearga fisierele din directorul .sterse mai vechi de o saptamina.

    Exemplu de program (rmv) realizat de studentul Horia Ceclan, grupa 341CA.
  • Tema 2
    Sa se scrie un script ce listeaza recursiv toate fisierele din directorul curent cu dimensiunea mai mare de o dimensiune data.

    Exemplu de program (lsall) realizat de studentul Horia Ceclan, grupa 341CA.
  • Tema 3
    Sa se scrie un script care omoara toate procesele ce apartin unui anumit utilizator

    Exemplu de program (killalluser) realizat de studentul Horia Ceclan, grupa 341CA.
#!/usr/local/bin/bash

if [ $# -lt 1 -o $# -gt 2 ]; then
echo 'usage: $0 filename [-mtime]'
else

if [ ! -d ~/.wastebasket ]; then
mkdir ~/.wastebasket
fi


if [ -e $1 ]; then
mv $1 ~/.wastebasket
else
if [ ! '$1' = '-mtime' ]; then
echo '$0: $1: No such file or directory'
else
echo 'Removing older files in ~/.wastebasket '
find ~/.wastebasket -mtime +7 -print -exec rm ;
find ~/.wastebasket -mtime 7 -print -exec rm ;
fi
fi


if [ $# -eq 2 ]; then
if [ '$2' = '-mtime' ]; then
echo 'Removing older files in ~/.wastebasket '
find ~/.wastebasket -mtime +7 -print -exec rm ;
find ~/.wastebasket -mtime 7 -print -exec rm ;
fi
fi
fi
#!/usr/local/bin/bash

if [ '$#' = '0' ]; then
echo 'usage: $0 size [bytes]'
else
export PWD=`pwd`
find $PWD -fprintf /tmp/flist.tmp '%s:%pn'

for i in `cat /tmp/flist.tmp`; do
j=`echo $i | cut -d: -f1`

if [ `expr $j` -gt `expr $1` ]; then
echo $i
fi
done
rm -f /tmp/flist.tmp
fi
#!/usr/local/bin/bash

if [ '$#' = '0' ]; then
echo 'usage: $0 username'
else
cat /etc/passwd | cut -d: -f1 | grep $1
if [ '$?' = '0' ]; then
ps -eaf | grep '$1'
if [ '$?' = '0' ]; then
echo 'Got it! Kid's a dead one '
ps -eaf | grep '$1' | cut -c 10-14 | xargs kill -9
else
echo '$1's broke. We got nothing on that name!'
fi
else
echo '$0: $1 - No such user!'
fi
fi


Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1213
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved