$ cat watchwho# watchwho: watch who logs in and outPATH=/bin:/usr/binnew=/tmp/wwho1.$$old=/tmp/wwho2.$$> $old # create an empty filewhile : # loop foreverdo who >$new diff $old $new mv $new $old sleep 60done | awk '/>/ { $1 = "in: "; print } /</ { $1 = "out: "; print }'$только обрабатывает свои аргументы и возвращает код "истина". Мы могли бы заменить ее командой
truefalse':'В выводе команды
diff<>awkawkawksedПоскольку файл
oldwatchforoldwho > $oldwatchforДругая программа в цикле следит за содержимым вашего почтового ящика: как только оно изменяется, программа выдает сообщение: "You have a mail" ("У вас есть почта"). Такая программа является полезной альтернативой встроенному в интерпретатор механизму, использующему переменную
MAIL$ cat checkmail# checkmail: watch mailbox for growthPATH=/bin:/usr/binMAIL=/usr/spool/mail/`getname` # system dependentt=${1-60}x="`ls -l $MAIL`"while :do y="`ls -l $MAIL`" echo $x $y x="$y" sleep $tdone | awk '$4 < $12 { print "You have mail" }'$Мы опять воспользовались
awkОбычно интервал времени устанавливается равным 60 с, но если командная строка содержит параметр, например
$ chekmail 30то интервал задается им. Переменная интерпретатора принимает в качестве значения заданное параметрами время или 60 с, если время не задано, с помощью присваивания
t=${1-60}Это еще одна возможность языка
shell${var}$var$ var=hello$ varx=goodbye$ echo $varhello$ echo ${var}xhellox$Определенные символы внутри фигурных скобок задают специальную обработку переменной. В том случае, когда переменная не определена и за ее именем идет знак вопроса, выдается строка, следующая за символом
?$ echo ${var?}hello $ echo ${junk}junk: parameter not set $ echo ${junk?error!}junk: error! $Отметим, что в сообщении, выдаваемом интерпретатором, всегда указывается имя неопределенной переменной.
В другой конструкции
${var-thing}$varthing${var-thing}$varthing$ echo ${junk-'Hi there'}Hi there$ echo ${junk?)junk: parameter not set $ echo {junk='Hi there'}Hi there$ echo ${junk?}Hi there