Вернуться к статье

Листинг 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? 


Вернуться к статье
474