View on GitHub

Практикум из рачунарских алата

ОЕ1-ПРА

ПРА: Linux скриптовање - задаци за вежбање

Задатак 1

Написати bash скрипту којој се прослеђује тачно један аргумент са командне линије. Исписати аргумент уколико је прослеђен тачно један, а у супротном обавестити корисника о неадекватном коришћењу скрипте.

Решење
#!/usr/bin/bash

if [[ $# -ne 1 ]]; then
    echo "Неисправно коришћење."
    echo "Очекивано: $0 аргумент1"
    exit 1
fi
echo $1

Задатак 2

Написати bash скрипту која захтева од корисника назив директоријума који ће бити креиран. Уколико директоријум са тим називом већ постоји, обуставити извршавање скрипте.

Потом је потребно приступити новонаправљеном директоријуму, као и исписати путању на којој се он налази. Затим, направити 4 празне датотеке произвољног назива, проверити резултат позивом наредбе ls.

У направљене датотеке уписати произвољан садржај, а онда их све ишчитати, односно уписани садржај исписати у терминалу (на стандардни излаз). За крај, почистити за собом, односно вратити се у изворни директоријум, и обрисати све направљене датотеке и поддиректоријум.

Решење
#!/bin/bash

# Prompts the user for a directory name and then creates it  with mkdir.

echo "Унети назив директоријума: "
read NEW_DIR

# Save original directory so we can return to it (could also just use pushd, popd)

ORIG_DIR=$(pwd)

# check to make sure it doesn't already exist!

[[ -d $NEW_DIR ]] && echo $NEW_DIR већ постоји. Извршавање се прекида... && exit
mkdir $NEW_DIR

# Changes to the new directory and prints out where it is using pwd.

cd $NEW_DIR
pwd

# Using touch, creates several empty files and runs ls on them to verify they are empty.

for n in 1 2 3 4
do
    touch датотека$n
done

ls -la датотека?

# (Could have just done touch датотека1 датотека2 датотека3 датотека4, just want to show do loop!)

# Puts some content in them using echo and redirection.

for name in датотека?
do
    echo Назив ове датотеке је $name > $name
done

# Displays their content using cat

echo "Садржаји датотека:"

cat датотека?

# Says goodbye to the user and cleans up after itself
cd "$ORIG_DIR"
rm -rf $NEW_DIR

Задатак 3

Написати bash скрипту унутар које су дефинисане 3 произвољне функције. Скрипта по позиву очекује кориснички унос у виду једног од бројева 1, 2, или 3, а затим позива одговарајућу функцију.

Решење
#!/bin/bash

# Functions (must be defined before use)
func1() {
echo "Позвана је функција 1"
}
func2() {
echo "Позвана је функција 2"
}
func3() {
echo "Позвана је функција 3"
}

# Beginning of the main script

# prompt the user to get their choice
echo "Унесите број од 1 до 3: "
read n

[[ $n != 1 ]] && [[ $n != 2 ]] && [[ $n != 3 ]] && \
    echo -e "Погрешан унос! Неопходно је унети један од бројева: 1,2,3 \nУнели сте: $n" && exit

# Call the chosen function
func$n

Задатак 4

Написати bash скрипту која очекује тачно један аргумент са командне линије. Потребно је да прослеђени аргумент буде број између 1 и 12, а задатак скрипте је да, на основу унетог броја, на стандардни излаз испише одговарајући месец у години.

Решење
#!/bin/bash

# Accept a number between 1 and 12 as
# an argument to this script, then return the
# the name of the month that corresponds to that number.

# Check to see if the user passed a parameter.
if [ $# -eq 0 ]
then
  echo "Грешка! Потребно је унети број од 1 до 12 као аргумент."
  exit 1
fi

if [ $# -gt 1 ]
then
  echo "Грешка! Очекује се тачно један аргумент."
  exit 1
fi


# set month equal to argument passed for use in the script
month=$1

################################################
# The example of a case statement:

case $month in

  1)  echo "Јануар"   ;;
  2)  echo "Фебруар"  ;;
  3)  echo "Март"     ;;
  4)  echo "Април"     ;;
  5)  echo "Мај"       ;;
  6)  echo "Јун"      ;;
  7)  echo "Јул"      ;;
  8)  echo "Август"    ;;
  9)  echo "Септембар" ;;
  10) echo "Октобар"   ;;
  11) echo "Новембар"  ;;
  12) echo "Децембар"  ;;
  *)
     echo "Грешка! Ниједан месец није нумерисан унетим бројем: $month"
     echo "Потребно је унети број између 1 и 12."
     exit 2
     ;;
esac
exit 0

Задатак 5

Написати bash скрипту којој се прослеђују тачно два аргумента са командне линије. Поменути аргументи јесу два стринга које је потребно упоредити. Обавестити корисника о томе који стринг је дужи, као и да ли се они поклапају.

Решење
#!/bin/bash

# check two string arguments were given
[[ $# -lt 2 ]] && \
    echo "Грешка! Потребно је проследити два стринга." && exit 1

str1=$1
str2=$2

#------------------------------------

len1=${#str1}
len2=${#str2}
echo Дужина првог стринга је $len1. Дужина другог стринга је $len2.

if [ $len1 -gt $len2 ]
then
    echo "Први стринг је дужи од другог."
else
    if [ $len2 -gt $len1 ]
    then
	echo "Други стринг је дужи од првог."
    else
	echo "Оба стринга су исте дужине."
    fi
fi

## compare the two strings to see if they are the same

if [[ $str1 == $str2 ]]
then
    echo "Унети стрингови су идентични."
else
    if [[ $str1 != $str2 ]]
    then
	echo "Унети стрингови се разликују."
    fi
fi

Задатак 6

Написати bash скрипту којој се прослеђују тачно три аргумента са командне линије. Нека први аргумент одговара операцији која ће се извршити над преостала два аргумента. Нека су дозвољене операције сабирање, одузимање, множење и дељење. Уколико је позив скрипте адекватан, исписати резултат извршавања задате операције над прослеђеним аргументима.

Решење
#!/bin/bash

# Functions. Must be before the main part of the script

add() {
    answer=$(($1 + $2))
}
sub() {
    answer=$(($1 - $2))
}
mult() {
    answer=$(($1 * $2))
}
div() {
    answer=$(($1 / $2))
}
# End of functions
#

# Main part of the script

# need 3 arguments, and parse to make sure they are valid types

op=$1 ; arg1=$2 ; arg2=$3

[[ $# -lt 3 ]] && \
    echo "Погрешан унос! Унети три аргумента. Први треба бити операција (a,s,m,d), а наредна два бројеви над којима ће се операција извршити." && exit 1

[[ $op != a ]] && [[ $op != s ]] && [[ $op != d ]] && [[ $op != m ]] && \
    echo Оператор мора бити a, s, m, или d. Оператор $op није подржан! && exit 1

# ok, do the work!

case $op in 
    a) add $arg1 $arg2 ;;
    s) sub $arg1 $arg2 ;;
    m) mult $arg1 $arg2 ;;
    d) div $arg1 $arg2 ;;
    *) echo Оператор $op није један од: a, s, m, или d!
	exit 2 ;;
esac

# Show the answers
echo $arg1 $op $arg2 :
echo Резултат је $answer.

Задатак 7

Написати bash скрипту коjа спаjа датотеке чиjи су називи задати као аргументи скрипте. Скрипта прима произвољан броj аргумената, али наjмање два, од коjих први представља излазну датотеку, док jедан или више преосталих аргумената представљаjу улазне датотеке чиjи садржаj треба споjити и уписати у датотеку прослеђену као први аргумент. Требало би проверити постојање излазне датотеке и могућност уписа у исту. Такође, може се десити да неке од задатих улазних датотека не постоjе или да корисник не поседуjе дозволу за њихово читање. Спаjање датотека се врши чак и у случаjу да неке од улазних датотека и не постоjе или су пак нечитљиве, све док постоjи макар jедна. Уколико се деси да излазна датотека већ постоjи, споjени улазни садржаj треба додати истоj.

Решење
#!/usr/bin/env bash
if (($# < 2)); then
    echo "Ниjе прослеђен довољан броj (макар два) аргумената." >&2
    exit 1
elif [[ -f "$1" && ! -w "$1" ]]; then
    echo "Немате дозволу за упис у постоjећу излазну датотеку." >&2
    exit 2
fi

izlaz="$1"
shift
ulaz=
for argument in "$@"; do
    if [[ -f "$argument" && -r "$argument" ]]; then
        ulaz="$ulaz \"$argument\""
    fi
done

if [[ -n "$ulaz" ]]; then
    eval "cat $ulaz" >> "$izlaz"
else
    echo "Не постоjи ниjедна читљива улазна датотека." >&2
    exit 3
fi
#или

#!/usr/bin/env bash
if [ $# -lt 2 ]; then
    echo "Ниjе прослеђен довољан броj (макар два) аргумената." >&2
    exit 1
elif [ -f "$1" -a ! -w "$1" ]; then
    echo "Немате дозволу за упис у постоjећу излазну датотеку." >&2
    exit 2
fi
izlaz="$1"
shift
ulaz=
for argument in "$@"; do
    if [ -f "$argument" -a -r "$argument" ]; then
        ulaz="$ulaz \"$argument\""
    fi
done
if [ -n "$ulaz" ]; then
    eval "cat $ulaz" >> "$izlaz"
else
    echo "Не постоjи ниjедна читљива улазна датотека." >&2
    exit 3
fi