Uruchamianie skryptów

Shell script uruchamiamy za pomocą jednej z komend
bash nazwa_skryptu
sh nazwa_skryptu
./nazwa_skryptu

Debugowanie skryptu

bash -v nazwaskryptu
bash -x nazwaskryptu

Pierwszy prosty skrypt
#moj pierwszy sktypt
clear
echo "Pierwsza wprawka"
Po zapisaniu należy zmienić prawa dostępu:
$ chmod 755 nazwa_skryptu

Kolejny skrypt
# Skrypt wypisujący informacje o użytkowniku, liczbie zalogowanych
# i kalendarz
clear
echo "Witaj $USER"
echo "Dzisiaj jest \c ";date
echo "Zalogowanych jest : \c" ; who | wc -l
echo "Kalendarz dla aktualnego miesiaca"
cal
exit 0

Zmienne globalne

Zmienne globalne
BASH - nazwa shella
BASH_VERSION - wersja shella
HOME - nazwa katalogu głównego
LOGNAME - nasz login
PATH - ścieżki dostępu
PWD - aktualny katalog roboczy
USERNAME - nazwa aktualnie zalogowanych użytkowników
COLUMNS - ilość wyświetlanych na ekranie kolumn
LINES - jak wyżej odnośnie lini

Zmienne użytkownika

Własne zmienne definiujemy w następujący sposób:
i=15
k=2
naz=zespol

Dostęp do takiej zmiennej mamy poprzez umieszczenie przed nazwą $.
$i+$k
Zmienna może mieć wartość NULL
z=
l=""
x=NULL

Przykład wypisania zawartości zmiennych:
#wyprowadzenie zmiennych na ekran
myname=Jan
myno=5
echo "Mam na imię: $myname"
echo "Mój numer: $myno"

Parametry wywołania skryptu

$* - wszystkie parametry od pierwszego.
$0 - nazwa skryptu.
$1 - pierwszy parametr.
$# - liczba parametrów.

Kilka informacji o funkcji echo

$ echo -e "An apple a day keeps away \a\t\tdoctor\n" away
-e powoduje że interpretowane są znaki:
\b - backspace
\n - nowa linia
\r - powrót karetki
\t - tabulator
\\ - backslash

Wyrażenia arytmetyczne

expr arg1 OperatorMatematyczny arg2
Przykład:
expr 1 + 2
expr 2 - 1
expr 10 / 3
expr 20 % 6 #reszta z dzielenia
expr 10 \* 3 #mnożenie
echo `expr 9 + 3`
echo "Dzisiaj mamy: `date`".
echo "Dzisiaj jest: date"
Przykłady let i (())
let z=z+3
y=$((y+3))
y=$[y+3]

Zmienna $?

Za pomocą zmiennej środowiskowej $? można sprawdzać wykonanie polecenia. Zmienna ta ma wartość 0 jeżeli polecenie zostało poprawnie wykonane i różne od zera jeżeli wystąpił błąd.
rm plikktoregoniema
echo $?

Czytanie ze standardowego wejścia.

składnia:
read zmienna1, zmienna2,...zmiennaN
Przykład
echo "Napisz jak masz na imię:"
read name
echo "Witam $name"

Instrukcje sterujące

>,<,==,!=,

if rm $1
then
echo "$1 plik skasowany"
fi

test wyrażenie lub [wyrażenie] sprawdza czy wyrażenie jest true (problem z $?).

Operatory dla wyrażeń matematycznych:

if[5 -eq 6] - równy
-ne - nie równy
-lt - mniejszy niż
-le - mniejszy lub równy
-gt - większy niż
-ge - większy lub równy

Operatory dla wyrażeń tekstowych:

str1=str2 - jest równy
!= - jest różny
str1 - zmienna tekstowa jest pusta lub nie zdefiniowana
-n str1 - zmienna tekstowa istnieje i nie jest pusta
-z str1 - zmienna nie istnieje i jest Null

Operatory dla katalogów i plików:

-s plik - czy plik nie jest pusty
-f plik - czy plik istnieje
-w plik - czy do pliku można zapisywać
-r plik - czy plik można czytać
-x plik - czy plik można wykonywać
-d dir - czy istnieje katalog

Wyrażenia logiczne:

! - zaprzeczenie
wyr1 -a wyr2 - logiczne NOT
wyr1 -o wyr2 - logiczne Or

If...then...else...fi

#!/bin/bash
# sprawdzenie czy argument skryptu jest dodatni
if [ $# -eq 0 ]
 then
   echo "$0 : You must give/supply one integers"
   exit 1
 fi

if test $1 -gt 0
 then
  echo "$1 number is positive"
 else
  echo "$1 number is negative"
fi

bash nazwaskryptu liczba

if...then...elif...then-else...fi

#!/bin/bash
#test if..elif...else
if [ $1 -gt 0 ]; then
  echo "$1 jest dodatnia"
 elif [ $1 -lt 0 ]
 then
  echo "$1 jest ujemna"
  elif [ $1 -eq 0 ]
  then
   echo "$1 równa jest 0"
 else
  echo "$1 nie jest liczbą"
fi

Pętle

Pętla for

#!/bin/bash
#Script to test for loop
if [ $# -eq 0 ]
 then
  echo "Musisz wpisać liczbę po nazwie skryptu"
  echo "Syntax : $0 number"
  exit 1
fi
n=$1
for i in 1 2 3 4 5 6 7 8 9 10
 do
  echo "$n * $i = `expr $i \* $n`"
done

for (( i = 0 ; i <= 5; i++ ))
 do
  echo "Wypisuje $i raz"
done

Pętla while

#!/bin/bash
if [ $# -eq 0 ]
 then
  echo "Brakuje argumentu przy wywołaniu skryptu"
  exit 1
fi
n=$1
i=1
while [ $i -le 10 ]
 do
  echo "$n * $i = `expr $i \* $n`"
  i=`expr $i + 1`
done

case

if [ -z $1 ]
 then
  czesc="nieznany element"
 elif [ -n $1 ]
  then
   czesc=$1
fi

case $czesc in
  "raz") echo "bylo 1";;
  "dwa") echo "bylo 2";;
  "trzy") echo "bylo 3";;
  *) echo "Nie ma więcej niz trzy";;
esac

Funkcje

nazwafunkcji( )
 {
  instrukcja1
  instrukcja2
  ...
  ...
  instrukcjaN
  return
 }

Literatura:
1. Linux Shell Scripting Tutorial v1.05r3
2. Linux - Kurs Podstawowy
3. The Linux Documentation Project