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 komanduIMEsa argumentima=iMarko.
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.