Skoči na vsebino

5. kviz

Link: ucilnica.fri.uni-lj.si

1. Bash is bad for math

Aritmetika

#!/bin/bash
x=8
y=4
z=$(expr $x + $y)
echo "Vsota števil $x + $y je $z"

- vaje5.pdf#page=22

Kako lahko še napišemo izraz i=$(expr $i + 10) na drugačen način, brez uporabe ukaza expr?

i=$(($i + 10))

2. Parse name from string

Spremenljivke (odstranitev podniza)

  • najkrajše ujemanje ${niz#podniz}
  • najdaljše ujemanje ${niz##podniz}
  • najkrajše ujemanje z zadnje strani ${niz%podniz}
  • najdaljše ujemanje z zadnje strani ${niz%%podniz}

- vaje5.pdf#page=6

Imamo spremenljivko $x, ki vsebuje nek niz oblike ime,priimek,datum rojstva,ulica,kraj. V spremenljivki so vsakič shranjeni podatki o drugi osebi. Kako bi z uporabo odstranitve ujemanja podniza izpisali samo ime? Rešitve z ukazom cut ali kakšnimi drugimi ukazi ne bodo sprejete.

echo ${x%%,*}
[aljazs@aljaxus-desktop-arch ~]$ x="ime,priimek,datum rojstva,ulica,kraj"
[aljazs@aljaxus-desktop-arch ~]$ echo ${x%%,*}
ime
[aljazs@aljaxus-desktop-arch ~]$ x="Aljaz,Starc,datum rojstva,ulica,kraj"
[aljazs@aljaxus-desktop-arch ~]$ echo ${x%%,*}
Aljaz
[aljazs@aljaxus-desktop-arch ~]$ x="Nikolaj Tilen,Tilnov,25.03.2022,ulica,kraj"
[aljazs@aljaxus-desktop-arch ~]$ echo ${x%%,*}
Nikolaj Tilen
[aljazs@aljaxus-desktop-arch ~]$ 

3. Infinite loop

Kako vse bi lahko implementirali neskončno zanko v Bashu? Izberite izmed ponujenih primerov.

Vrstica Odgovor
while 1; do ❌ ne drzi
while [ 1 -ne 0 ]; do ✅ drzi
while false; do ❌ ne drzi
while :; do ✅ drzi
while true; do ✅ drzi
[aljazs@aljaxus-desktop-arch ~]$ while 1; do date; done
bash: 1: command not found
[aljazs@aljaxus-desktop-arch ~]$ 
[aljazs@aljaxus-desktop-arch ~]$ while [ 1 -ne 0 ]; do date; done
Fri Mar 25 21:18:04 CET 2022
Fri Mar 25 21:18:04 CET 2022
... truncated ...
Fri Mar 25 21:18:04 CET 2022
Fri Mar 25 21:18:04 CET 2022
^C
[aljazs@aljaxus-desktop-arch ~]$ 
[aljazs@aljaxus-desktop-arch ~]$ while false; do date; done
[aljazs@aljaxus-desktop-arch ~]$ 
[aljazs@aljaxus-desktop-arch ~]$ while :; do date; done
Fri Mar 25 21:23:56 CET 2022
Fri Mar 25 21:23:56 CET 2022
... truncated ...
Fri Mar 25 21:23:56 CET 2022
Fri Mar 25 21:23:56 CET 2022
^C
[aljazs@aljaxus-desktop-arch ~]$ 
[aljazs@aljaxus-desktop-arch ~]$ while true; do date; done
Fri Mar 25 21:24:30 CET 2022
Fri Mar 25 21:24:30 CET 2022
... truncated ...
Fri Mar 25 21:24:30 CET 2022
Fri Mar 25 21:24:30 CET 2022
^C
[aljazs@aljaxus-desktop-arch ~]$ 

4. Ukaz [ -f "$3" ];

test, [ ], [[ ]]

-f datoteka - Ali je datoteka navadna datoteka?

- vaje5.pdf#page=16

Kaj naredi ukaz [ -f "$3" ]; znotraj skripte?

Vrstica Odgovor
Preveri pogoj ali je tretji argument klica skripte imenik. ❌ ne drzi
Preveri pogoj, ali je datoteka, ki jo poda tretji argument klica skripte, obstaja in je navadna datoteka. ✅ drzi
Nastavi vrednost spremenljivke $3 na vrednost false. ❌ ne drzi
Preveri pogoj, ali datoteka, ki jo poda tretji argument klica skripte, obstaja (ne glede na tip datoteke). ❌ ne drzi
[aljazs@aljaxus-desktop-arch ~]$ ls -l
total 52
... truncated ...
-rw-r--r-- 1 aljazs aljazs   689 Jan 28 22:32 problemi-resitve.txt
-rw-r--r-- 1 aljazs aljazs    51 Mar 25 21:35 skripta.sh
[aljazs@aljaxus-desktop-arch ~]$ cat skripta.sh 
#!/bin/bash

[ -f "$3" ] && echo ok || echo false
[aljazs@aljaxus-desktop-arch ~]$ # test regularne datoteke ki obstaja
[aljazs@aljaxus-desktop-arch ~]$ bash skripta.sh arg1 arg2 problemi-resitve.txt 
ok
[aljazs@aljaxus-desktop-arch ~]$ # test regularne datoteke ki ne obstaja
[aljazs@aljaxus-desktop-arch ~]$ bash skripta.sh arg1 arg2 problemi-resitve.txt.neobstaja
false
[aljazs@aljaxus-desktop-arch ~]$ # test directory-ja
[aljazs@aljaxus-desktop-arch ~]$ bash skripta.sh arg1 arg2 gitrepos                      
false
[aljazs@aljaxus-desktop-arch ~]$ 

5. Menjava znakov v stringu

Spremenljivke (zamenjava podniza)

Zamenja vsa ujemanja ${niz//podniz/zamenjava}

- vaje5.pdf#page=8

Kako bi v spremenljivki $x, ki vsebuje nek niz zamenjali vse pojavitve črke e s črko o?

x=${x//e/o}

Obstaja tudi ukaz tr, ki je prisoten v (skoraj) vseh distribucijah. Se moras ze res potruditi da najdes kaksno ki ga nima built-in (celo busybox ga ima).

Pravilen a neupostevan odgovor
echo $x | tr e o
[aljazs@aljaxus-desktop-arch ~]$ x="niz x s vsaj eno crko e"
[aljazs@aljaxus-desktop-arch ~]$ echo $x
niz x s vsaj eno crko e
[aljazs@aljaxus-desktop-arch ~]$ echo $x | tr e o
niz x s vsaj ono crko o
[aljazs@aljaxus-desktop-arch ~]$ 
[aljazs@aljaxus-desktop-arch ~]$ # In ce zelimo to novo vrednost zapisati v spremenljivko x
[aljazs@aljaxus-desktop-arch ~]$ x=$(echo $x | tr e o)
[aljazs@aljaxus-desktop-arch ~]$ echo $x
niz x s vsaj ono crko o
[aljazs@aljaxus-desktop-arch ~]$ 

Zadnja posodobitev: April 4, 2022