3.3 Lekcija 1
Sertifikat: |
Linux Essentials |
---|---|
Verzija: |
1.6 |
Tema: |
3 Moć komandne linije |
Cilj: |
3.3 Pretvaranje komandi u skriptu |
Lekcija: |
1 od 2 |
Uvod
Do sada smo učili da izvršavamo komande iz šela, ali takođe možemo unjeti komande u datoteku, a zatim postaviti tu datoteku da bude izvršna. Kada se datoteka izvrši, te komande se pokreću jedna za drugom. Ove izvršne datoteke se zovu skripte (eng.scripts), i one su apsolutno krucijalan alat za svakog administratora Linux sistema. U suštini, Bash možemo smatrati programskim jezikom kao i šelom.
Printanje izlaza
Počnimo s demonstracijom komande koju ste možda vidjeli u prethodnim lekcijama: echo
će ispisati argument na standardni izlaz.
$ echo "Hello World!" Hello World!
Sada ćemo koristiti preusmjeravanje datoteke da pošaljemo ovu komandu u novu datoteku pod nazivom new_script
.
$ echo 'echo "Hello World!"' > new_script $ cat new_script echo "Hello World!"
Datoteka new_script
sada sadrži istu komandu kao i prije.
Kreiranje izvršne skripte
Hajde da demonstriramo neke od koraka potrebnih da bi se ova datoteka izvršila na način na koji očekujemo. Prva pomisao korisnika bi mogla biti da jednostavno upiše ime skripte, na način na koji bi mogli upisati ime bilo koje druge komande:
$ new_script /bin/bash: new_script: command not found
Možemo sa sigurnošću pretpostaviti da new_script
postoji na našoj trenutnoj lokaciji, ali primijetite da nam poruka o grešci ne govori da file ne postoji, već nam govori kako komanda ne postoji. Bilo bi korisno razgovarati o tome kako Linux upravlja komandama i izvršnim datotekama.
Komande i PATH
Kada upišemo komandu ls
u šel, na primjer, mi izvršavamo datoteku pod nazivom ls
koja postoji u našem sistemu datoteka. To možete dokazati korištenjem komande which
:
$ which ls /bin/ls
Brzo bi postalo zamorno upisivati apsolutnu putanju ls
svaki put kada želimo da pogledamo sadržaj direktorija, tako da Bash ima varijablu okruženja koja sadrži sve direktorije u kojima možemo pronaći komande koje želimo da pokrenemo. Možete vidjeti sadržaj ove varijable koristeći echo
.
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Svaka od ovih lokacija je mjesto gdje šel očekuje da pronađe komandu, ograničenu dvotačkama (:
). Primijetit ćete da je /bin
prisutan, ali sigurno je pretpostaviti da naša trenutna lokacija nije. Šel će tražiti new_script
u svakom od ovih direktorija, ali ga neće pronaći i stoga će izbaciti grešku koju smo vidjeli gore.
Postoje tri rješenja za ovaj problem: možemo premjestiti new_script
u jedan od PATH
direktorija, možemo dodati naš trenutni direktorij u PATH
, ili možemo promijeniti način na koji pokušavamo pozvati skriptu. Potonje rješenje je najlakše, jednostavno zahtijeva od nas da navedemo trenutnu lokaciju kada pozivamo skriptu pomoću kose crte (./
).
$ ./new_script /bin/bash: ./new_script: Permission denied
Poruka o grešci se promijenila, što ukazuje da smo napravili određeni napredak.
Dozvole izvršavanja
Prva istraga koju korisnik treba da uradi u ovom slučaju je da upotrebi ls -l
da pogleda datoteku:
$ ls -l new_script -rw-rw-r-- 1 user user 20 Apr 30 12:12 new_script
Možemo vidjeti da su dozvole za ovu datoteku podrazumjevano postavljene na 664
. Još nismo dodijelili ovoj datoteci dozvolu za izvršavanje.
$ chmod +x new_script $ ls -l new_script -rwxrwxr-x 1 user user 20 Apr 30 12:12 new_script
Ova komanda je dala dozvole za izvršavanje svim korisnicima. Imajte na umu da ovo može biti sigurnosni rizik, ali za sada je ovo prihvatljiv nivo dozvole.
$ ./new_script Hello World!
Sada možemo izvršiti našu skriptu.
Definisanje interpretera
Kao što smo pokazali, mogli smo jednostavno da unesemo tekst u datoteku, postavimo je kao izvršnu i pokrenemo. new_script
je funkcionalno još uvijek normalna tekstualna datoteka, ali uspjeli smo da ga interpretira Bash. Ali šta ako je napisano u Perlu ili Pythonu?
Veoma je dobra praksa da u prvom redu skripte navedete tip interpretera koji želimo da koristimo. Ova linija se zove bang line ili češće shebang. To ukazuje sistemu kako želimo da se ova datoteka izvrši. Pošto učimo Bash, koristićemo apsolutnu putanju do našeg izvršnog programa Bash, još jednom koristeći which
:
$ which bash /bin/bash
Naš shebang počinje sa znakom heša i uskličnikom, nakon čega slijedi apsolutna putanja iznad. Otvorimo new_script
u tekst editoru i ubacimo shebang. Iskoristimo i priliku da ubacimo komentar u našu skriptu. Prevodilac ignoriše komentare. Napisane su za dobrobit drugih korisnika koji žele razumjeti vašu skriptu.
#!/bin/bash # Ovo je naš prvi komentar. Dobra je praksa da dokumentujete sve skripte. echo "Hello World!"
Napravit ćemo i jednu dodatnu promjenu u nazivu datoteke: sačuvat ćemo ovu datoteku kao new_script.sh
. Sufiks datoteke ".sh" ni na koji način ne mijenja izvršavanje datoteke. Konvencija je da se bash skripte označavaju sa .sh
ili .bash
kako bi se lakše identifikovale, na isti način na koji se Python skripte obično identifikuju sa sufiksom .py
.
Česti urednici teksta
Korisnici Linuxa često moraju da rade u okruženju gde grafički urednici teksta nisu dostupni. Stoga se preporučuje da se barem malo upoznate sa urednicima tekstualnih datoteka iz komandne linije. Dva najčešća urednika teksta su vi
i nano
.
vi
vi
je vrijedan urednik teksta i instaliran je prema zadanim postavkama na skoro svakom postojećem Linux sistemu. vi
je stvorio klon pod nazivom vi IMproved ili vim
koji dodaje neke funkcionalnosti, ali održava interfejs vi
-a. Iako je rad sa `vi`om zastrašujući za novog korisnika, urednik je popularan i omiljen među korisnicima koji nauče njegove brojne funkcije.
Najvažnija razlika između vi
i aplikacija kao što je Notepad je da vi
ima tri različita načina rada. Prilikom pokretanja, tasteri H, J, K i L se koriste za navigaciju, a ne za kucanje. U ovom navigacijskom načinu, možete pritisnuti I da uđete u insert mode. U ovom trenutku možete kucati normalno. Da izađete iz insert mode, pritisnite Esc da se vratite u navigation mode. Iz navigacijskog načina, možete pritisnuti : da uđete u komandni način. Iz ovog načina možete sačuvati, izbrisati, izaći ili promijeniti opcije.
Dok vi
ima krivulju učenja, različiti modovi mogu vremenom omogućiti pametnom korisniku da postane efikasniji nego kod drugih urednika.
nano
nano
je noviji alat, napravljen da bude jednostavan i lakši za korištenje od vi
. nano
nema različite načine rada. Umjesto toga, korisnik pri pokretanju može početi kucati i koristi Ctrl da pristupi alatima ispisanim na dnu ekrana.
[ Welcome to nano. For basic help, type Ctrl+G. ] ^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo ^X Exit ^R Read File ^\ Replace ^U Uncut Text ^T To Spell ^_ Go To Line M-E Redo
Urednici teksta su stvar ličnog odabira, a urednik koji odaberete neće imati uticaja na ovu lekciju. Ali upoznavanje sa jednim ili više urednika teksta isplatit će se u budućnosti.
Varijable
Varijable su važan dio svakog programskog jezika, a Bash se ne razlikuje. Kada pokrenete novu sesiju sa terminala, šel vam već postavlja neke varijable. Varijabla PATH
je primjer ovoga. Ove varijable zovemo varijable okruženja, jer one obično definišu karakteristike našeg šel okruženja. Možete mijenjati i dodavati varijable okruženja, ali za sada se fokusirajmo na postavljanje varijabli unutar naše skripte.
Modificirat ćemo našu skriptu tako da izgleda ovako:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol echo "Hello $username!"
U ovom slučaju, kreirali smo varijablu pod nazivom username
i dodijelili smo joj vrijednost Carol
. Imajte na umu da nema razmaka između imena varijable, znaka jednakosti ili dodijeljene vrijednosti.
U sljedećem redu koristili smo komandu echo
sa varijablom, ali ispred naziva varijable nalazi se znak dolara ($
). Ovo je važno, jer ukazuje šelu da želimo da tretiramo korisničko ime
kao varijablu, a ne kao normalnu riječ. Unošenjem $username
u našu komandu označavamo da želimo izvršiti zamjenu, zamjenjujući naziv varijable s vrijednošću dodijeljenom toj varijabli.
Izvršavanjem skripte, dobit ćemo sljedeći izlaz:
$ ./new_script.sh Hello Carol!
-
Imena varijabli moraju sadržavati samo alfanumeričke znakove ili donje crte i razlikuju velika i mala slova.
Username
iusername
će se tretirati kao zasebne varijable. -
Zamjena varijable također može imati format
${username}
, sa dodatkom{ }
. Ovo je također prihvatljivo. -
Varijable u Bashu imaju implicitni tip i smatraju se nizovima. To znači da je izvođenje matematičkih funkcija u Bashu kompliciranije nego što bi bilo u drugim programskim jezicima kao što je C/C++:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol x=2 y=4 z=$x+$y echo "Hello $username!" echo "$x + $y" echo "$z"
$ ./new_script.sh Hello Carol! 2 + 4 2+4
Korištenje navodnika sa varijablama
Napravimo sljedeću promjenu u vrijednosti naše varijable username
:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=Carol Smith echo "Hello $username!"
Izvršavanjem skripte dobit ćemo grešku:
$ ./new_script.sh ./new_script.sh: line 5: Smith: command not found Hello !
Imajte na umu da je Bash interpreter, i kao takav on interpretira naš skriptu red po red. U ovom slučaju, ispravno interpretira username=Carol
kao postavljanje varijable username
sa vrijednošću Carol
. Ali onda razmak tumači kao označavanje kraja tog dodjeljivanja, a Smith
kao ime komande. Da bi razmak i ime Smith
bili uključeni kao nova vrijednost naše varijable, stavićemo dvostruke navodnike ("
) oko imena.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username="Carol Smith" echo "Hello $username!"
$ ./new_script.sh Hello Carol Smith!
Jedna važna stvar koju treba napomenuti u Bashu je da se dvostruki i jednostruki navodnici (''
) ponašaju vrlo različito. Dvostruki navodnici se smatraju “slabim”, jer dozvoljavaju interpreteru da izvrši zamjenu unutar navodnika. Jednostruki navodnici se smatraju “jakim” jer sprečavaju da dođe do bilo kakve zamjene. Razmotrite sljedeći primjer:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username="Carol Smith" echo "Hello $username!" echo 'Hello $username!'
$ ./new_script.sh Hello Carol Smith! Hello $username!
U drugoj komandi echo
, interpreteru je spriječeno da zamijeni $username
sa Carol Smith
, tako da je izlaz shvaćen doslovno.
Argumenti
Već ste upoznati sa upotrebom argumenata u šelu Linux uslužnih programa. Na primjer, rm testfile
sadrži i izvršni rm
i jedan argument testfile
. Argumenti se mogu proslijediti skripti nakon izvršenja i modificirat će kako se skripta ponaša. Lako se implementiraju.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=$1 echo "Hello $username!"
Umjesto dodjeljivanja vrijednosti korisničkom imenu
direktno unutar skripte, mi mu dodjeljujemo vrijednost nove varijable $1
. Ovo se odnosi na vrijednost prvog argumenta.
$ ./new_script.sh Carol Hello Carol!
Prvih devet argumenata se obrađuje na ovaj način. Postoje načini za rješavanje više od devet argumenata, ali to je izvan okvira ove lekcije. Pokazat ćemo primjer koristeći samo dva argumenta:
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username1=$1 username2=$2 echo "Hello $username1 and $username2!"
$ ./new_script.sh Carol Dave Hello Carol and Dave!
Postoji važno razmatranje kada se koriste argumenti: U gornjem primjeru postoje dva argumenta Carol
i Dave
, dodijeljena $1
i $2
respektivno. Ako, na primjer, nedostaje drugi argument, šel neće prikazati grešku. Vrijednost $2
jednostavno će biti null, ili ništa.
$ ./new_script.sh Carol Hello Carol and !
U našem slučaju, bilo bi dobro da uvedemo malo logike u našu skriptu tako da će različiti uslovi utjecati na izlaz koji želimo ispisati. Počećemo uvođenjem još jedne korisne varijable, a zatim preći na kreiranje if izraza.
Vraćanje broja argumenata
Dok varijable kao što su $1
i $2
sadrže vrijednost pozicionih argumenata, druga varijabla $#
sadrži broj argumenata.
#!/bin/bash # This is our first comment. It is also good practice to comment all scripts. username=$1 echo "Hello $username!" echo "Number of arguments: $#."
$ ./new_script.sh Carol Dave Hello Carol! Number of arguments: 2.
Uslovna logika
Upotreba uslovne logike u programiranju je ogromna tema i neće biti detaljno obrađena u ovoj lekciji. Fokusiraćemo se na sintaksu kondicionala u Bashu, koja se razlikuje od većine drugih programskih jezika.
Počnimo sa pregledom onoga što se nadamo da ćemo postići. Imamo jednostavnu skriptu koja bi trebala biti u mogućnosti ispisati pozdrav za jednog korisnika. Ako postoji još nešto osim jednog korisnika, trebali bismo ispisati poruku o grešci.
-
uslov koji testiramo je broj korisnika koji je sadržan u varijabli
$#
. Željeli bismo znati da li je vrijednost$#
1
. -
Iako je uslov true, akcija koju ćemo preduzeti je da pozdravimo korisnika.
-
Ako je uslov false, printat ćemo poruku o grešci. Sada kada je logika jasna, fokusiraćemo se na sintaksu potrebnu za implementaciju ove logike.
#!/bin/bash # A simple script to greet a single user. if [ $# -eq 1 ] then username=$1 echo "Hello $username!" else echo "Please enter only one argument." fi echo "Number of arguments: $#."
Uslovna logika se nalazi između if
i fi
. Uslov za testiranje nalazi se između uglastih zagrada [ ]
, a radnja koju treba poduzeti ako je uslov istinit je naznačena nakon then
. Obratite pažnju na razmake između uglastih zagrada i sadržanu logiku. Izostavljanje ovog prostora će uzrokovati greške.
Ova skripta će ispisati ili naš pozdrav, ili poruku o grešci. Ali uvijek će ispisati red broja argumenata
.
$ ./new_script.sh Please enter only one argument. Number of arguments: 0. $ ./new_script.sh Carol Hello Carol! Number of arguments: 1.
Obratite pažnju na komandu if
. Koristili smo -eq
za numeričko poređenje. U ovom slučaju, testiramo da je vrijednost $#
jednaka jedinici. Ostala poređenja koja možemo izvesti su:
-ne
-
Nije jednako
-gt
-
Veci nego
-ge
-
Veće ili jednako
-lt
-
Manje od
-le
-
Manje ili jednako
Vođene vježbe
-
Korisnik u svoj šel upisuje sljedeće:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Šta je učinio korisnik?
-
Koja komanda će kombinirati trenutnu vrijednost
PATH
sa novim direktorijem~/scripts
?
-
-
Razmotrite sljedeću skriptu. Primijetite da koristi
elif
za provjeru drugog uslova:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Linije označene sa
>
sadrže greške. Popravite ih.
-
-
Kakav će biti rezultat u sljedećim situacijama?
$ ./guided1.sh 3 0
$ ./guided1.sh 2 4
$ ./guided1.sh 0 1
Istraživačke vježbe
-
Napišite jednostavnu skriptu koja će provjeriti da li su proslijeđena tačno dva argumenta. Ako je tako, ispišite argumente obrnutim redoslijedom. Razmotrite ovaj primjer (napomena: vaš kod može izgledati drugačije od ovog, ali bi trebao dovesti do istog izlaza):
if [ $1 == $number ] then echo "True!" fi
-
Ovaj kod je ispravan, ali nije poređenje brojeva. Koristite internet pretragu da otkrijete kako se ovaj kod razlikuje od upotrebe
-eq
. -
Postoji varijabla okruženja koja će ispisati trenutni direktorij. Koristite
env
da otkrijete ime ove varijable. -
Koristeći ono što ste naučili u pitanjima 2 i 3, napišite kratku skriptu koja prihvaća argument. Ako je argument proslijeđen, provjerite da li se taj argument podudara s imenom trenutnog direktorija. Ako je tako, prikaži
da
. U suprotnom, prikažine
.
Sažetak
U ovom dijelu ste naučili:
-
Kako kreirati i izvršiti jednostavne skripte
-
Kako koristiti shebang za navođenje interpretera
-
Kako postaviti i koristiti varijable unutar skripti
-
Kako rukovati argumentima u skriptama
-
Kako konstruisati
if
izraze -
Kako upoređivati brojeve pomoću numeričkih operatora
Komande korištene u ovoj vježbi:
echo
-
Prikaži string na standardni izlaz.
env
-
Prikaži sve varijable okruženja na standardni izlaz.
which
-
Prikaži apsolutnu putanju komande.
chmod
-
Promijeni dozvole datoteke.
Specijalne varijable korištene u ovoj vježbi:
$1, $2, … $9
-
Sadrži pozicione argumente proslijeđene skripti.
$#
-
Sadrži broj argumenata proslijeđenih skripti.
$PATH
-
Sadrži direktorije koji imaju izvršne datoteke koje koristi sistem.
Operatori korišteni u ovoj vježbi:
-ne
-
Nije jednako
-gt
-
Veci nego
-ge
-
Veće ili jednako
-lt
-
Manje od
-le
-
Manje ili jednako
Odgovor na istraživačke vježbe
-
Korisnik u svoj šel upisuje sljedeće:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Šta je učinio korisnik?
Korisnik je zamijenio sadržaj PATH sa direktorijem
~/scripts
. Komandals
se više ne može pronaći, jer nije sadržana u varijabli PATH. Imajte na umu da ova promjena utječe samo na trenutnu sesiju, odjavljivanje i ponovno prijavljivanje će poništiti promjene. -
Koja komanda će kombinirati trenutnu vrijednost
PATH
sa novim direktorijem~/scripts
?PATH=$PATH:~/scripts
-
-
Razmotrite sljedeću skriptu. Primijetite da koristi
elif
za provjeru drugog uslova:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Linije označene sa karakterom
>
sadrže greške. Popravite ih.#!/bin/bash fruit1=Apples fruit2=Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" elif [ $1 -gt $2 ] then echo "$fruit1 win!" else echo "$fruit2 win!" fi
-
-
Kakav će biti rezultat u sljedećim situacijama?
$ ./guided1.sh 3 0
Apples win!
$ ./guided1.sh 2 4
Oranges win!
$ ./guided1.sh 0 1
Ovo je kao da poredite jabuke i narandže!
Odgovor na istraživačke vježbe
-
Napišite jednostavnu skriptu koja će provjeriti da li su proslijeđena tačno dva argumenta. Ako je tako, ispišite argumente obrnutim redoslijedom. Razmotrite ovaj primjer (napomena: vaš kod može izgledati drugačije od ovog, ali bi trebao dovesti do istog izlaza):
if [ $1 == $number ] then echo "True!" fi
#!/bin/bash if [ $# -ne 2 ] then echo "Error" else echo "$2 $1" fi
-
Ovaj kod je ispravan, ali nije poređenje brojeva. Koristite internet pretragu da otkrijete kako se ovaj kod razlikuje od upotrebe
-eq
.Korištenje
==
će uporediti nizove (eng.strings). To jest, ako se karakteri obje varijable tačno poklapaju, onda je uslov tačan.abc == abc
true
abc == ABC
false
1 == 1
true
1+1 == 2
false
Poređenja nizova dovodi do neočekivanog ponašanja ako testirate brojeve.
-
Postoji varijabla okruženja koja će ispisati trenutni direktorij. Koristite
env
da otkrijete ime ove varijable..PWD
-
Koristeći ono što ste naučili u pitanjima 2 i 3, napišite kratku skriptu koja prihvaća argument. Ako je argument proslijeđen, provjerite da li se taj argument podudara s imenom trenutnog direktorija. Ako je tako, prikaži
da
. U suprotnom, prikažine
.#!/bin/bash if [ "$1" == "$PWD" ] then echo "yes" else echo "no" fi