## ЗАБЕЛЕЖКА
## Навсякъде, където значението на променлива е име на файл или е друг низ, който може да съдържа интервали,
## табулации или нови редове, а имаме нужда то да се разглежда като една дума, сме го оградили в " ", за да 
## предотвратим разделянето му от шел-а на отделни думи, които да се тълкуват например като отделни имена
## на файлове.

#!/bin/sh
## USERLOG
until who | grep "^$1\>" > /dev/null
do
	sleep 20
done
echo "$1 has logged in"
## Регулярният израз, който подаваме на grep, ни осигурява търсене за низа, 
## съдържащ се в $1, като първа дума на реда - редът да започва с този низ (^ отпред)
## и след този низ думата да не продължава (\> отзад). Това ни предпазва например от
## ситуацията, в която търсим потребител с името user, докато в системата е логнат user1.
## Пренасочваме стандартния изход, за да не се изпишат match-натите от успешен grep редове.


#!/bin/sh
## STRING_SEARCH
read string
for filename
do
	echo -n "$filename: "
	grep -c "$string" < "$filename"
	echo
done
## Използваме опцията -c на grep, която брои в колко реда е открито съвпадение и изписва на стандартния
## изход полученото число.


#!/bin/bash
## MESS_USERS
read message
for username
do
	( who | grep "^$username\>" > /dev/null ) && write $username <<< $message
done
## Аналогично на първата задача правим проверката за това дали потребител с указаното име е логнат. 
## За изпращането на съобщението използваме специфичният за bash синтаксис
## за пренасочване на вход към даден символен низ чрез <<<. Обърнете внимание, че ако съобщението
## е на повече от един ред, прочитането му ще трябва да се направи по алтернативен начин като например:
## message=`cat`
## В този случай въвеждащият интерактивно съобщението трябва да натисне Ctrl+D за да прекрати стандартния
## вход към cat.


#!/bin/sh
## CHECKSIZE
if [ -d "$1" ]
then
    for filename in "$1"/*
    do
        [ -f "$filename" ] && [ `wc -c < "$filename"` -gt $2 ] && echo "$filename"
    done
else
    echo "CHECKSIZE: $1 does not exist or is not a directory"
fi
## За да получим размера на файла с указаното име използваме wc -c (wc --bytes), чийто вход пренасочваме
## към файла, защото изходът на "wc -c filename" ще бъде "размерът filename". Алтернативно може да
## използваме и pipe: `cat "$filename" | wc -c`.


#!/bin/sh
## OUT_FILES
if [ `ls "$1"/*.out | wc -l` -gt `ls "$2"/*.out | wc -l` ]
then
    mkdir RWFiles
    echo "Created directory RWFiles"
    for filename in "$1"/*
    do
        [ -f "$filename" -a -r "$filename" -a -w "$filename" ] && mv "$filename" RWFiles
    done
fi


#!/bin/sh
## TOT_CI
n=0
n=`ls $1/*.c $2/*.c | wc -l` 2> /dev/null
if test $n -gt 20
then
    ls "$1"/*.c "$2"/*.c > filelist.txt
    chmod a+r-wx filelist.txt
else
    echo "$1 and $2 contain $n files with C code"
fi
## В началото изрично указваме стойност 0 за n, за да може, ако в директориите няма файлове
## с търсеното разширение, да не остане стойността на n празен низ. Също така затова и пренасочваме 
## стандартния изход за грешки на следващия ред. Ако присвояването на истинската стойност не е 
## успешно, стойността 0 на n ще се запази.


#!/bin/sh
## COPYREADABLE
mkdir ~/"$1" 2> /dev/null
n=0
for filename in *
do
    if [ -f "$filename" -a -r "$filename" ]
    then
        cp "$filename" ~/"$1"
    else
        n=$[$n+1]
    fi
done
echo "$n files without read permission in current direcory"
## Проверка дали търсената директория съществува, при условие, че в противен случай ще я създадем, 
## е излишна. Командата mkdir ще направи такава проверка и ще изведе съобщение на стандартния изход за 
## грешки, ако директорията съществува. Пренасочваме го към /dev/null, понеже това съобщение 
## не ни интересува, не указва грешка в нашата програма.
## ~ се разширява до името на началната директория на текущия потребител.


#!/bin/bash
## NAME_CUT
for filename in "$1"/*.c
do
    gcc -o ${filename%.c}.exe "$filename" &
done
## ${filename%.c} ни връща низ, който съдържа собственото име на файла, без .c накрая.
## Тази задача е извън учебния материал.
