Листинг 1 Условный оператор
#!/bin/bash
echo -n ?First value: ?
read VAL1 #Вводим первое значение.
echo -n ?Second value: ?
read VAL2 #Вводим второе значение.
#Если они равны, выводим соответствующее сообщение.
if [ ?x$VAL1? = ?x$VAL2? ] ; then
echo ?$VAL1 = $VAL2 ...?
#Если равны их длины, сообщаем и об этом.
elif [ ?${#VAL1}? = ?${#VAL2}? ] ; then
echo ?$VAL1 != $VAL2 but length($VAL1) = length($VAL1)...?
#Иначе сообщаем, что не равны ни значения, ни длины.
else
echo ?$VAL1 != $VAL2 and length($VAL1) !=length($VAL1)...?
fi
Листинг 2 Оператор выбора
#!/bin/bash
echo -n ?Enter the name of an animal: ?
read ANIMAL #Вводим название животного.
echo -n ?The $ANIMAL has ?
case $ANIMAL in
horse | dog | cat) echo -n ?four?;;
#У лошади, собаки, кошки, четыре ноги.
man | kangaroo ) echo -n ?two?;;
#У человека и у кенгуру две ноги.
*) echo -n ?an unknown number of?;;
#Про остальных неизвестно.
esac
echo ? legs.?
Вернуться к статье
Листинг 3 Цикл while
#!/bin/bash
echo -n ?Enter n: ?
read n #Вводим число.
fac=1 i=n
while ((i>1)) ; do #Вычисляем его факториал.
((fac=fac*i—))
done
echo ?$n!=$fac?
Вернуться к статье
Листинг 4 Цикл for, первый вариант
#!/bin/bash
echo -n ?Enter n: ? #Вводим число.
read n
fac=1 i=n
for ((fac=1,i=n;i>1;i—)) ; do #Вычисляем его факториал.
((fac=fac*i))
done
echo ?$n!=$fac?
Вернуться к статье
Листинг 5 Цикл for, второй вариант
#!/bin/bash
echo -n ?Enter directory: ? #Вводим путь к каталогу.
read dir
for i in ?$dir?/* ; do #Для каждого файла в каталоге
fs=?`ls -s ?$i? | cut -d ? ? -f 2`? #находим его длину
if ((fs>100)) ; then #Если она больше 100,
echo ?$fs $i? #выводим длину и имя файла.
fi
done | sort -r -n #Сортируем все файлы по убыванию размера.
Вернуться к статье
Листинг 6 Использование функций
#!/bin/bash
biggest_interp=/bin/sh
biggest_interp_size=0
#Функция находит самый длинный файл среди заданных в качест-
#ве параметров и, если его размер больше хранящегося в пере-
#менной biggest_interp_size, запоминает имя файла в перемен-
#ной biggest_interp, а размер — в biggest_interp_size.
sum () {
local interpreter size;
for interpreter ; do
#Если в цикле for перебирается список параметров,
#то запись in ?$@? в заголовке можно опустить.
if [ -e ?$interpreter? ] ; then
((size=`du ?$interpreter?|cut -d$? ? -f 1`))
#Команда du определяет, сколько места занимает файл, cut
#вырезает из ее ответа нужную нам часть.
if ((size>biggest_interp_size)) ; then
biggest_interp=?$interpreter?
biggest_interp_size=?$size?
fi
fi
done
}
sum `cat /etc/shells`
#Применяем нашу функцию к каталогу /etc/shells, где хранятся #различные интерпретаторы,
sum /usr/bin/perl* /usr/bin/tcl* /usr/bin/guile*
#а затем — к каталогам с интерпретаторами perl, tcl и guile, #и в результате получаем имя и размер самого большого интер-
#претатора в системе.
echo ?Biggest interpreter (${biggest_interp_size}K): $biggest_interp?
Вернуться к статье
Листинг 7 Использование массивов
#!/bin/bash
COMMAND_NAME=big_command
#У команды big_command много разных ключей. Чтобы пользо-
#ватель не должен был их все вспоминать,дадим ему подсказку.
unset ARGUMENT_LIST
#Обнуляем массив для списка ключей.
echo ?Command so far: $COMMAND_NAME ${ARGUMENT_LIST[*]} $*?
#Выводим имя команды и уже введенные параметры.
select argument in quit go -i -f -r -p ; do
#Предлагаем пользователю на выбор:
#go — выполнить команду;
if [[ ?$argument? == ?go? ]] ; then
break
#quit — прервать выполнение;
elif [[ ?$argument? == ?quit? ]] ; then
exit
#-i, -f, -r или -p — добавить соответствующий
#ключ в массив ARGUMENT_LIST.
elif [[ ${ARGUMENT_LIST[*]} != * ?$argument? * ]] ;
then
ARGUMENT_LIST[${#ARGUMENT_LIST[@]}]=?$argument?
fi
echo ?Command so far: $COMMAND_NAME ${ARGUMENT_LIST[*]} $*?
done
?$COMMAND_NAME? ?${ARGUMENT_LIST[@]}? ?$@?
#Выполняем big_command с ключами из ARGUMENT_LIST.
Вернуться к статье
Листинг 8 Использование перенаправления
#!/bin/bash
echo -n ?Enter directory: ?
read dir #Вводим имя каталога
exec 3100)) ; then #и если он больше 100 Кбайт,
echo ?$fs $i? #выводим размер файла и его имя.
fi
done | sort -r -n | while read size fname ; do
#Получившийся список сортируем по убыванию размера,
echo -n ?$size ?
#и для каждого файла выводим его размер,
rm -i — ?$fname?
|