Шрифт:
$ 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
Рассмотрим, как работает приведенный сценарий. Сначала проверим, установлена ли эта переменная. Если это так, появляется сообщение, что редактор vi применяется как редактор, заданный по умолчанию. Затем vi устанавливается в качестве редактора, и сценарий завершается.
Если редактор vi не установлен, пользователю поступает запрос, следует ли установить это значение. Проверка выполняется независимо от регистра, в котором находится символ у. Если пользователь не вводит значения, отличные от у или у, сценарий завершается.
На данном этапе пользователю предлагается ввести тип редактора. Затем выполняется проверка, не установлен ли данный редактор, а также уточняется, не нажимал ли пользователь во время проверки $editor ="" клавишу [Return]. Действительно эта проверка реализована лучше, чем -z $editor, но оба этих метода приводятся лишь в качестве иллюстрации. Если результаты проверки будут отрицательны, на экран выводится сообщение, что применяется редактор vi, причем значение vi присваивается переменной editor.