Мендель Купер - Искусство программирования на языке сценариев командной оболочки
- Название:Искусство программирования на языке сценариев командной оболочки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Мендель Купер - Искусство программирования на языке сценариев командной оболочки краткое содержание
Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.
Искусство программирования на языке сценариев командной оболочки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
exit 0
Файл data-file для Пример 11-18, представленного выше, должен находиться в том же каталоге.
# Этот файл подключается к сценарию.
# Подключаемые файлы могут содержать об"явления переменных, функций и т.п.
# Загружаться может командой 'source' или '.' .
# Инициализация некоторых переменных.
variable1=22
variable2=474
variable3=5
variable4=97
message1="Привет! Как поживаете?"
message2="Досвидания!"
print_message ()
{
# Вывод сообщения переданного в эту функцию.
if [ -z "$1" ]
then
return 1
# Ошибка, если аргумент отсутствует.
fi
echo
until [ -z "$1" ]
do
# Цикл по всем аргументам функции.
echo -n "$1"
# Вывод аргумента с подавлением символа перевода строки.
echo -n " "
# Вставить пробел, для разделения выводимых аргументов.
shift
# Переход к следующему аргументу.
done
echo
return 0
}
Сценарий может подключить даже самого себя, только этому едва ли можно найти какое либо практическое применение.
Пример 11-19. Пример (бесполезный) сценария, который подключает себя самого.
#!/bin/bash
# self-source.sh: сценарий, который рекурсивно подключает себя самого."
# Из "Бестолковые трюки", том II.
MAXPASSCNT=100 # Максимальное количество проходов.
echo -n "$pass_count "
# На первом проходе выведет два пробела,
#+ т.к. $pass_count еще не инициализирована.
let "pass_count += 1"
# Операция инкремента неинициализированной переменной $pass_count
#+ на первом проходе вполне допустима.
# Этот прием срабатывает в Bash и pdksh, но,
#+ при переносе сценария в другие командные оболочки,
#+ он может оказаться неработоспособным или даже опасным.
# Лучшим выходом из положения, будет присвоить переменной $pass_count
#+ значение 0, если она неинициализирована.
while [ "$pass_count" -le $MAXPASSCNT ]
do
. $0 # "Подключение" самого себя.
# ./$0 (истинная рекурсия) в данной ситуации не сработает.
done
# Происходящее здесь фактически не является рекурсией как таковой,
#+ т.к. сценарий как бы "расширяет" себя самого
#+ (добавляя новый блок кода)
#+ на каждом проходе цикла 'while',
#+ командой 'source' в строке 22.
#
# Само собой разумеется, что первая строка (#!), вновь подключенного сценария,
#+ интерпретируется как комментарий, а не как начало нового сценария (sha-bang)
echo
exit 0 # The net effect is counting from 1 to 100.
# Very impressive.
# Упражнение:
# ----------
# Напишите сценарий, который использовал бы этот трюк для чего либо полезного.
exit
Безусловное завершение работы сценария. Команде exitможно передать целое число, которое будет возвращено вызывающему процессу как код завершения. Вообще, считается хорошей практикой завершать работу сценария, за исключением простейших случаев, командой exit 0, чтобы проинформировать родительский процесс об успешном завершении.
Если сценарий завершается командой exitбез аргументов, то в качестве кода завершения сценария принимается код завершения последней выполненной команды, не считая самой команды exit.
exec
Это встроенная команда интерпретатора shell, заменяет текущий процесс новым процессом, запускаемым командой exec. Обычно, когда командный интерпретатор встречает эту команду, то он порождает дочерний процесс, чтобы исполнить команду. При использовании встроенной команды exec, оболочка не порождает еще один процесс, а заменяет текущий процесс другим. Для сценария это означает его завершение сразу после исполнения команды exec. По этой причине, если вам встретится execв сценарии, то, скорее всего это будет последняя команда в сценарии.
Пример 11-20. Команда exec
#!/bin/bash
exec echo "Завершение \"$0\"." # Это завершение работы сценария.
# ----------------------------------
# Следующие ниже строки никогда не будут исполнены
echo "Эта строка никогда не будет выведена на экран."
exit 99 # Сценарий завершит работу не здесь.
# Проверьте код завершения сценария
#+ командой 'echo $?'.
# Он точно не будет равен 99.
Пример 11-21. Сценарий, который запускает себя самого
#!/bin/bash
# self-exec.sh
echo
echo "Эта строка в сценарии единственная, но она продолжает выводиться раз за разом."
echo "PID остался равным $$."
# Демонстрация того, что команда exec не порождает дочерний процесс.
echo "==================== Для завершения - нажмите Ctl-C ===================="
sleep 1
exec $0 # Запуск очередного экземпляра этого же сценария
#+ который замещает предыдущий.
echo "Эта строка никогда не будет выведена!" # Почему?
exit 0
Команда execтак же может использоваться для перенаправления. Так, команда exec заменит стандартное устройство ввода ( stdin ) файлом zzz-file (см. Пример 16-1).
Ключ -exec команды find -- это не то же самое, что встроенная команда exec.
shopt
Эта команда позволяет изменять ключи (опции) оболочки на лету (см. Пример 23-1 и Пример 23-2). Ее часто можно встретить в стартовых файлах, но может использоваться и в обычных сценариях. Требует Bash версии 2 или выше.
shopt -s cdspell
# Исправляет незначительные орфографические ошибки в именах каталогов в команде 'cd'
cd /hpme # Oops! Имелось ввиду '/home'.
pwd # /home
# Shell исправил опечатку.
Команды
true
Команда возвращает код завершения -- ноль, или успешное завершение, и ничего больше.
# Бесконечный цикл
while true # вместо ":"
do
operation-1
operation-2
...
operation-n
# Следует предусмотреть способ завершения цикла.
done
false
Возвращает код завершения, свидетельствующий о неудаче, и ничего более.
# Цикл, который никогда не будет исполнен
while false
do
# Следующий код не будет исполнен никогда.
operation-1
operation-2
...
operation-n
done
type [cmd]
Очень похожа на внешнюю команду which, type cmdвыводит полный путь к "cmd". В отличие от which, typeявляется внутренней командой Bash. С опцией -a не только различает ключевые слова и внутренние команды, но и определяет местоположение внешних команд с именами, идентичными внутренним.
bash$ type '['
[ is a shell builtin
bash$ type -a '['
[ is a shell builtin
Читать дальшеИнтервал:
Закладка: