5. cvičení
Programování v shellu (Bash)
# Retezce
string="Unix is the best"
# Delka retezce
echo ${#string}
# Podretezec
# Syntaxe: ${string::}
string="Unix is the best"
${string:1:1}
# Index podretezce
string="Unix is the best"
substring="t"
expr index "$string" "$substring" # -> Prvni vyskyt t je na indexu 8
# Pokud vynechame delku podretezce tak se pokracuje az do konce
string="Unix is the best"
echo ${string:1} # $string bez prvniho znaku
echo ${string:12} # best
# Nahrazeni retezce
# Nahrazeni prvniho vyskytu
string="Unix is the best. Unix"
echo ${string[@]/Unix/Windows} # Windows is the best, Unix
# Nahrazeni vsech vyskytu
string="Unix is the best. Unix"
echo ${string[@]//Unix/Windows} # Windows is the best, Windows
# Odstraneni podretezce (nahrazeni prazdnym)
string="Unix is the best. Unix"
echo ${string[@]// the/} # Unix is best. Unix
# Funkce
# Definice funkce
function add {
echo $(($1 + $2))
}
# Volani funkce je totozne s volanim prikazu
add 1 1
# Pokud chceme ulozit vysledek do promenne tak musime v tele funkce pouzit echo
sum=$(add 2 2)
echo $sum
# Prace se soubory
# Existence souboru
filename="text.txt"
if [ -e "$filename" ]; then
echo "File $filename exists"
fi
# Existence adresare
directory_name="unix"
if [ -d "$directory_name" ]; then
echo "Directory $directory_name exists"
fi
# Pole
#Deklarace pole
array=(Homer Marge "The Simpsons" Magie)
# Prirazeni
array[2]=Bart
# Delka pole
echo ${#array[@]}
# Pridani prvku do pole
array[4]="Lisa"
echo ${#array[@]} # 5
echo ${array[${#array[@]}-1]} # Magie
# Append
array+="Ned"
# Vypis pole
printf '%s\n' "${array[@]}"
Úkoly
Obě Skupiny
-
Napište funkce
convert_to_decimal
aconvert_from_decimal
. Funkceconvert_to_decimal
bere dva argumenty první je číslo a druhy je poziční soustava (2 až 64). Funkce převede číslo do desítkové soustavy. Funkceconvert_from_decimal
bere také dva argumenty, kde první je číslo v desítkové soustavě a druhý argument je soustava do které mame číslo převést. Čísla větší než 9 jsou malá a velká písmena anglické abecedy a znaky @ a _.parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_8.sh convert_from_decimal 222 3 -> 22020 convert_from_decimal 222 16 -> de convert_from_decimal 222 32 -> 6u convert_to_decimal 22020 3 -> 222 convert_to_decimal de 16 -> 222 convert_to_decimal 6u 32 -> 222
1 bod
-
Implementujte jako funkce (zjednodušené) programy dirname a basename: z cesty zadané jako parametr, po odebrání případného / na konci, vrátí (vypíše) část do a od poslední / (bez něj, pokud to není jediný znak). Pokud již cesta / neobsahuje, dirname vrátí '.' a basename celé jméno.
parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_9.sh /media/psf/PhD/UNIX/ basename UNIX dirname /media/psf/PhD parallels@ubuntu:/media/psf/PhD/UNIX/Lectures$ ./homework_9.sh /media/psf/PhD/UNIX/Lectures/homework_9.sh basename homework_9.sh dirname /media/psf/PhD/UNIX/Lectures
1 bod
-
V systému bývá zvykem, že se u logů provadí tzv. rotace. Soubor
xy
se přejmenuje naxy.0
,xy.0
naxy.1
atd. až do nějaké horní hranice, soubory s číslem nad touto hranicí se vymažou. Napište program, který dostává dva parametry - jméno souboru a maximální počet uložených kopií (lze vynechat, implicitní hodnota je 30) - a proveďte rotaci.1 bod