echo "Yes indeed you are $LOGNAME proceed"
fi
# выполнение операторов в обычном режиме
18.3.13. Передача параметров сценария системной команде
Позиционные параметры можно передать сценарию, а затем проверить значение переменной. Если при этом пользователь указывает после названия сценария наименование каталога, сценарий заново присваивает специальному параметру $1 более содержательное название, в данном случае directory. С помощью команды ls -A проверяется, не является ли каталог пустым. Если каталог пуст, эта команда не возвращает данные. Затем отображается соответствующее сообщение.
$ pg ifdirec
#!/bin/sh
#ifdirec
#присваивание $1 переменной DIRECTORY DIRECTORY=$1
if [ "`ls -A $DIRECTORY/`"="" ] ; then
# если строка пуста, каталог пуст
echo "$DIRECTORY is indeed empty" else
# в противном случае, нет
echo "$DIRECTORY” is not empty"
fi
Вместо указанного метода можно воспользоваться другой возможностью. Получим аналогичный результат.
$ pg ifdirec2
#!/bin/sh
# ifdirec2
DIRECTORY=$1
if [ -z "`ls -A $DIRECTORY`" ] then
echo "$DIRECTORY is indeed empty" else
echo "$DIRECTORY is not empty"
fi
18.3.14. Применение команды null
Обычно при проведении проверки условий выполняются части then и else. Иногда независимо от того, истинно или ложно условие, нет необходимости переходить к действиям.
К сожалению, нельзя оставлять незаполненными части оператора if — здесь должен находиться какой‑либо оператор. Чтобы разрешить это затруднение, интерпретатор shell поддерживает команду null ':'. Команда null всегда возвращает значение "истина", что в данном случае нас удовлетворяет. Возвращаясь к предыдущему примеру, заметим, что если каталог пуст, команды можно размещать только в части then.
$ pg ifdirectory
#!/bin/sh
# ifdirectory
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`"="" ]
then
echo "$DIRECTORY is indeed empty"
else : # не выполняет ничего
fi
18.3.15. Проверка на предмет создания каталога
В продолжение темы каталогов рассмотрим следующий сценарий. Сценарий получает параметр и пытается создать каталог при помощи значения этого параметра. Параметр передается на командную строку и заново присваивается переменной под названием directory. В данном случае проверяется, является ли переменная нулем.
if [ "$DIRECTORY" = "" ]
Вместо предложенного варианта можно воспользоваться общим случаем проверки параметров:
if [ $# -lt 1 ]
Если строка нулевая, отображается соответствующее сообщение и сценарий завершается. Если каталог уже имеется, никаких дополнительных действий не предпринимается и сценарий выполняется далее.
Пользователь получает запрос, действительно ли нужно создавать каталог. Если он вводит символ, отличный от Y или у, выполняется команда null, в результате чего не предпринимается никаких действий. Каталог создан.
Чтобы проверить, создан ли каталог, применяется код завершения последней команды. Если каталог не был создан, отображается соответствующее сообщение.
$ pg ifmkdir
#!/bin/sh
#ifmkdir
#параметр передается как $1, но заново присваивается переменной DIRECTORY DIRECTORY=$1
#является ли строка пустой ??
if [ "$DIRECTORY"="" ]
then
echo "Usage: `basename $0` directory to create" >&2
exit 1
fi
if [ -d $DIRECTORY ] then :
# ничего не выполняет
else
echo "The directory does exist"
echo -n "Create it now? [y..n] :"
read ANS
if [ "$ANS"="y" ] || [ "$ANS"="Y" ]
then
echo "creating now"
# создайте каталог и перешлите все данные вывода в /dev/null mkdir $DIRECTORY >/dev/null 2>&1 if [ $? != 0 ]; then
echo "Errors creating the directory $DIRECTORY" >&2
exit 1
fi
else :
# ничего не выполняет
fi
При выполнении указанного сценария получим следующее:
$ ifmkdir dt
The directory does exist Create it now? [y..n]: у
creating now
18.3.16. Другие возможности копирования
С помощью команды cp сценарию передается два параметра (они должны содержать имена файлов). Затем системная команда cp копирует значение параметра $1 в параметр $2, а поток вывода перенаправляется в /dev/null. Если команда выполнилась успешно, никаких действий не предпринимается, т. е. применяется команда null.
С другой стороны, если в процессе выполнения команды произошел сбой, об этом следует узнать до завершения сценария.
$ pg ifcp2
#!/bin/sh
#ifcp2
if cp $1 $2 > /dev/null 2>&1
# успешно, ничего делать не надо
then :
else
# плохо, покажем пользователю, какие файлы здесь были.
echo "`'basename $0`: ERROR failed to copy $1 to $2"
exit 1
fi
Выполнение сценария при отсутствии ошибки, связанной с командой ср:
$ ifср2 myfile.lex myfile.lex.bak
Сценарий выполняется при наличии ошибок в команде ср:
$ ifcp2 myfile.lexx myfile.lex.bak
ifcp2: ERROR failed to copy myfile.lexx myfile.lex.bak
В следующем примере для сортировки файла под именем accounts.qtr применяется команда sort.
Результаты вывода направляются в системную корзину. Но кому интересно видеть на экране 300 отсортированных строк? Если сортировка прошла успешно, не нужно предпринимать никаких действий; если при выполнении команды имелись сбои, следует сообщить об этом пользователю.
$ pg ifsort
#!/bin/sh
# ifsort
if sort accounts.qtr > /dev/null
# отсортировано. Прекрасно
then :
else
# лучше сообщим об этом пользователю
echo "`basename $0`: Oops..errors could not sort accounts.qtr"
18.3.17. Применение нескольких операторов if
Операторы if можно вкладывать; при этом нужно следить, чтобы каждому ключевому слову if соответствовало слово fi.
18.3.18. Проверка и установка переменных среды
В предыдущих разделах к переменной среды editor обращались, чтобы узнать, установлена ли она. Сделаем шаг вперед и уточним, не была ли переменная среды установлена ранее. Ниже приводится соответствующий сценарий.
$ pg ifseted
#!/bin/sh
#ifseted
#установлена ли переменная EDITOR ?
if [ -z $EDITOR ] ; then
echo "Your EDITOR environment ls not set"
echo "2 will assume you want to use vi..OK"
echo -n "Do you wish to change it now? [y..n] :"
read ANS
# проверка верхнего или нижнего регистра для 'у'
if [ "$ANS"="у" ] || [ "$ANS"="Y" ]; then
echo "enter your editor type :"
read EDITOR
if [ -z $EDITOR ] || [ "$EDITOR"="" ]; then
#если переменная EDITOR не установлена, ей не присвоено значение,
#тогда присвоим ей значение vi
echo "No, editor entered, using vi as default"
EDITOR=vi; export EDITOR
fi
# берется значение и присваивается переменной EDITOR
EDITOR=$EDITOR
export EDITOR
echo "setting $EDITOR"
fi
else
# пользователь
echo "Using vi as the default editor"
EDITOR=vi; export EDITOR
fi