Gym
lesson

Varijable i argumenti

Varijable su osnova svakog programskog jezika, pa i Bash skriptovanja. Omogućavaju nam da čuvamo vrednosti i koristimo ih na više mesta u skripti.

Definisanje varijabli

Varijablu definišemo jednostavnom dodelom vrednosti:

IME="Marko"
BROJ=42
POZDRAV="Zdravo svete"

Važno: Nema razmaka oko znaka =. IME = "Marko" je greška — shell bi pokušao da izvrši komandu IME sa argumentima = i Marko.

Konvencija je da se varijable pišu velikim slovima, ali to nije obavezno. Varijable definisane u skripti su lokalne za tu skriptu.

Korišćenje varijabli

Vrednost varijable dobijamo sa prefiksom $:

#!/bin/bash
IME="Ana"
GRAD="Beograd"

echo "Zdravo, $IME!"
echo "Živiš u gradu $GRAD."

Izlaz:

Zdravo, Ana!
Živiš u gradu Beograd.

Preporučena forma je ${IME} sa vitičastim zagradama — to je posebno korisno kada se varijabla koristi uz druge karaktere:

FAJL="izvestaj"
echo "${FAJL}_2024.txt"   # izvestaj_2024.txt
echo "$FAJL_2024.txt"     # GREŠKA: traži varijablu FAJL_2024

Dvostruki vs jednostruki navodnici

Ovo je jedna od najvažnijih razlika u Bash-u:

IME="Marko"

echo "Zdravo, $IME"    # Zdravo, Marko  (varijabla je zamenjena)
echo 'Zdravo, $IME'    # Zdravo, $IME   (doslovno, bez zamene)

Dvostruki navodnici (") — dozvoljavaju zamenu varijabli i komandnu supstituciju.

Jednostruki navodnici (') — sve između tretira se doslovno, bez ikakve zamene.

DATUM=$(date +%Y-%m-%d)
echo "Danas je $DATUM"         # Danas je 2024-01-15
echo 'Danas je $DATUM'         # Danas je $DATUM
echo "Putanja je: $HOME"       # Putanja je: /home/student
echo 'Putanja je: $HOME'       # Putanja je: $HOME

Quoting — kada koristiti ", ' ili ništa

Ovo je jedan od najčešćih izvora grešaka u Bash skriptama, posebno kada su u pitanju razmaci u imenima fajlova.

PRAVILO: UVEK KORISTITI DVOSTRUKE NAVODNIKE OKO PROMENLJIVIH

cp $izvor $odrediste        # LOSE — pada ako ime ima razmak
cp "$izvor" "$odrediste"    # DOBRO

Primer sa razmakom u imenu fajla:

ime="Moji Dokumenti"

ls $ime           # ls: cannot access 'Moji': No such file or directory
                  #     cannot access 'Dokumenti': No such file or directory
ls "$ime"         # ispravno — tretira kao jedan argument: Moji Dokumenti

Bez navodnika Bash razdvaja Moji Dokumenti na dve odvojene reči i pokušava da nađe fajl Moji i fajl Dokumenti. Sa dvostrukim navodnicima cela vrednost varijable ostaje jedan argument.

Specijalne varijable

Bash automatski postavlja određene varijable koje su uvek dostupne u skriptama:

Varijable za argumente

#!/bin/bash
echo "Ime skripte: $0"
echo "Prvi argument: $1"
echo "Drugi argument: $2"
echo "Treći argument: $3"
echo "Svi argumenti: $@"
echo "Broj argumenata: $#"

Pokretanje: bash skripta.sh Ana Beograd 25

Izlaz:

Ime skripte: skripta.sh
Prvi argument: Ana
Drugi argument: Beograd
Treći argument: 25
Svi argumenti: Ana Beograd 25
Broj argumenata: 3

Exit code: $?

Svaka komanda vraća exit code — broj koji označava da li je komanda uspela:

  • 0 = uspeh
  • Bilo koji drugi broj = greška
#!/bin/bash
ls /home/student
echo "Exit code ls-a: $?"    # 0 (uspeh)

ls /nepostojeci-direktorijum
echo "Exit code: $?"          # 2 (greška)

Ostale specijalne varijable

Varijabla Značenje
$0 Ime skripte
$1 - $9 Argumenti od 1 do 9
$@ Svi argumenti kao zasebne reči
$* Svi argumenti kao jedna reč
$# Broj argumenata
$? Exit code prethodne komande
$$ PID trenutnog procesa (skripte)
$! PID poslednjeg pozadinskog procesa

Čitanje korisničkog unosa sa read

Komanda read čita unos od korisnika:

#!/bin/bash
echo "Kako se zoveš?"
read IME

echo "Zdravo, $IME!"

Možete koristiti -p da ispišete prompt u istoj liniji:

read -p "Unesi svoje ime: " IME
echo "Zdravo, $IME!"

Opcija -s sakriva unos (korisno za lozinke):

read -s -p "Lozinka: " LOZINKA
echo ""   # Novi red posle skrivenog unosa
echo "Lozinka je uneta."

Čitanje više varijabli odjednom:

read -p "Ime i prezime: " IME PREZIME
echo "Ime: $IME, Prezime: $PREZIME"

Environment varijable

Environment varijable su globalne varijable dostupne svim procesima. Možete ih videti sa env ili printenv:

echo $HOME      # /home/student
echo $USER      # student
echo $PATH      # /usr/local/bin:/usr/bin:/bin:...
echo $SHELL     # /bin/bash

Izvoz varijabli sa export

Varijable definisane u skripti su lokalne — child procesi (novi procesi pokrenuti iz trenutnog) ih ne vide. Da biste varijablu učinili dostupnom child procesima, koristite export:

#!/bin/bash
LOKALNA="vidim je samo ja"
export GLOBALNA="vide me i child procesi"

bash -c 'echo $LOKALNA'    # (prazno)
bash -c 'echo $GLOBALNA'   # vide me i child procesi

Modifikacija PATH

PATH je lista direktorijuma u kojima shell traži komande. Možete joj dodati sopstvene direktorijume:

export PATH="$PATH:/home/student/skripte"

Ovo treba staviti u ~/.bashrc da bi trajno ostalo.

Aritmetika

Za matematičke operacije koristimo $(( )):

#!/bin/bash
A=10
B=3

echo "Zbir: $((A + B))"        # 13
echo "Razlika: $((A - B))"     # 7
echo "Proizvod: $((A * B))"    # 30
echo "Količnik: $((A / B))"    # 3 (celobrojno deljenje)
echo "Ostatak: $((A % B))"     # 1

Komandna supstitucija

Izlaz komande možemo sačuvati u varijablu:

DATUM=$(date +%Y-%m-%d)
KORISNICI=$(who | wc -l)
HOSTNAME=$(hostname)

echo "Datum: $DATUM"
echo "Broj ulogovanih: $KORISNICI"
echo "Hostname: $HOSTNAME"

Starija sintaksa koristi backtick karaktere `, ali $() je preporučena forma jer je čitljivija i podržava ugnježdavanje.

Praktičan primer

#!/bin/bash
# Skripta koja pozdravlja korisnika po imenu i prikazuje info

read -p "Unesi svoje ime: " IME

DATUM=$(date +"%d.%m.%Y")
VREME=$(date +"%H:%M")
HOSTNAME=$(hostname)

echo ""
echo "=== DOBRODOŠLI ==="
echo "Zdravo, $IME!"
echo "Danas je $DATUM, $VREME"
echo "Prijavljeni ste na računar: $HOSTNAME"
echo "Vaš home direktorijum je: $HOME"
echo "=================="

Rezime

Koncept Sintaksa Primer
Definisanje varijable IME=vrednost GRAD="Beograd"
Korišćenje varijable $IME ili ${IME} echo $GRAD
Argumenti $1, $2, ... echo $1
Svi argumenti $@ for arg in $@
Broj argumenata $# if [[ $# -eq 0 ]]
Exit code $? echo $?
Korisnički unos read VAR read -p "Ime: " IME
Komandna supstitucija $(komanda) DATUM=$(date)
Export export VAR export PATH="$PATH:..."

U sledećoj lekciji naučićemo kako da donosimo odluke u skriptama koristeći uslovne naredbe.