Программирование в стандарте POSIX


Листинг 2.


ls -al /bin | wc -l
Листинг 2. 1. Пример конвейера.
Закрыть окно




ls -al | grep "Oct "
Листинг 2.2. Еще один пример конвейера.
Закрыть окно




ls -al | grep "Oct " | wc -l
Листинг 2.3. Пример трехступенчатого конвейера.
Закрыть окно






ls -Rl /dev | more
Листинг 2.4. Конвейер для поэкранного просмотра результатов.
Закрыть окно




ls -al | grep "Oct" | tee /tmp/tmpinf | wc -l
Листинг 2. 5. Четырехступенчатый конвейер.
Закрыть окно




a=value_of_variable b=1+2 echo a = $a echo b = $b
Листинг 2.6. Присваивание и извлечение значение переменных.
Закрыть окно




a = value_of_variable b = 1+2
Листинг 2.7. Результат вывода значений переменных.
Закрыть окно




echo Имя команды: $ 0 echo Значение первого аргумента: $1 echo Значение второго аргумента: $2 echo Значение третьего аргумента: $3
Листинг 2.8. Пример shell-процедуры.
Закрыть окно




three_args arg1 . - arg4
Листинг 2.9. Пример вызова shell-процедуры с аргументами.
Закрыть окно




Имя команды: three_args Значение первого аргумента: arg1 Значение второго аргумента: . Значение третьего аргумента: -
Листинг 2.10. Результат выполнения shell-процедуры.
Закрыть окно




Имя команды: three_args Значение первого аргумента: arg1 Значение второго аргумента: -- Значение третьего аргумента:
Листинг 2.11. Еще один результат выполнения shell-процедуры.
Закрыть окно




f=file. f mv $f ${f%.f}.for
Листинг 2.12. Пример сопоставления с образцом.
Закрыть окно




f=маршрутное_имя echo ${f%%/*}
Листинг 2.13. Второй пример сопоставления с образцом.
Закрыть окно




echo ${f##*/}
Листинг 2.14. Третий пример сопоставления с образцом.
Закрыть окно




echo Идентификатор текущего процесса: $$ echo Имя команды: $ 0 echo Число фактических аргументов: $# echo Совокупность всех аргументов: $@ echo Значение первого аргумента: $1 echo Значение второго аргумента: $2 echo Значение третьего аргумента: $3
Листинг 2.15. Усовершенствованная shell-процедура three_args.
Закрыть окно




Идентификатор текущего процесса: 3882 Имя команды: three_args Число фактических аргументов: 4 Совокупность всех аргументов: arg1 . - arg4 Значение первого аргумента: arg1 Значение второго аргумента: . Значение третьего аргумента: -
Листинг 2.16. Результат вызова усовершенствованной процедуры three_args.
Закрыть окно




export HISTSIZE="1000" export HOME="/home/galat" export LANG="C" export LESSCHARSET="koi8-r" export LOGNAME="galat" export MAIL="/var/spool/mail/galat" export TTY="/dev/ttyS4" export USER="galat"
Листинг 2.17. Возможные результаты выполнения команды export -p.
Закрыть окно




echo Идентификатор текущего процесса: $$ echo Имя команды: $ 0 echo Число фактических аргументов: $# echo Совокупность всех аргументов: $@ i=1 for arg do echo Значение аргумента номер ${i}: $arg i=$(($i+1)) done
Листинг 2.18. Еще одно усовершенствование shell-процедуры three_args.
Закрыть окно




if [ -s ${f} ] then /bin/sh ${f} start fi
Листинг 2.19. Пример условного оператора.
Закрыть окно




case "$1" in start) start ;; stop) stop ;; reload | restart) restart ;; condrestart) if [ -f /var/lock/subsys/atd ] then restart fi ;; *) echo $"Usage: $0 {start | stop | restart | condrestart}" exit 1 esac
Листинг 2.20. Пример оператора выбора.
Закрыть окно




echo $# $1 f ( ) { echo $# $1 } f a b f b echo $# $1
Листинг 2.21. Пример определения и вызова функции.
Закрыть окно




for f in /etc/rc$runlevel.d/S* do if [ -s ${f} ] then /bin/sh ${f} start fi done
Листинг 2.22. Пример сочетания управляющих конструкций с генерацией имен файлов.
Закрыть окно




for f in *. f do mv $f `basename $f .f`.for done
Листинг 2.23. Пример подстановки результатов команды как части слова.
Закрыть окно




time команда >cmd.res 2>cmd.time
Листинг 2.24. Пример перенаправления стандартного вывода и стандартного протокола.
Закрыть окно




i= 0 while [ $i -lt 40 ] do > lost+found/g$i i=$(($i+1)) done rm lost+found/*
Листинг 2.25. Пример перенаправления стандартного вывода пустой команды.
Закрыть окно




cat << END_OF_TEXT A clear- text version of the Tripwire configuration file $TXT_CFG has been preserved for your inspection. It is recommended that you delete this file manually after you have examined it. END_OF_TEXT
Листинг 2.26. Пример использования вставки.
Закрыть окно




cat <<eof1; cat <<eof2 Вставка 1 eof1 Вставка 2 eof2
Листинг 2.27. Пример использования двух последовательных вставок.
Закрыть окно




while [ "$1" ] do [ -f $1 ] && echo $ 1 shift done
Листинг 2.28. Пример использования специальной встроенной команды shift.
Закрыть окно




argv1="$1" set `/sbin/runlevel` runlevel=$2 previous=$1
Листинг 2.29. Пример использования специальной встроенной команды set. (административная утилита runlevel выдает предыдущий и текущий уровни выполнения системы).
Закрыть окно




#include <stdlib.h> int system (const char *command); #include <stdio.h> FILE *popen (const char *command, const char *mode);
Листинг 2.30. Описание функций system() и popen().
Закрыть окно




while getopts :abo: c do case $c in a | b) FLAG=$c;; o) OARG=$OPTARG;; ?) printf "Использование: %s: [-a | -b] [-o выходной_файл] [аргумент ...]\n" $0 exit 1;; esac done shift $(($OPTIND - 1)) printf "Заданный флаг: %s\n" $FLAG printf "Аргумент опции o: %s\n" $OARG printf "Остаток командной строки: %s\n" "$*"
Листинг 2.31. Пример использования служебной программы getopts.
Закрыть окно




cmd -a -o f1.o,f2.o file1 - cmd -ba -o f1.o,f2.o -- file1 - cmd -o f1.o,f2.o -b -a file1 -
Листинг 2.32. Возможные варианты вызова shell-процедуры, использующей служебную программу getopts.
Закрыть окно




Заданный флаг: a Аргумент опции o: f1.o,f2. o Остаток командной строки: file1 -
Листинг 2.33. Возможный результат работы shell-процедуры, использующей служебную программу getopts.
Закрыть окно




#include <unistd.h> int getopt (int argc, char *const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;
Листинг 2.34. Описание функции getopt() и ассоциированных с ней внешних переменных.
Закрыть окно




/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Программа разбирает опции вызвавшей ее командной строки */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include <unistd.h> #include <stdio.h> int main (int argc, char *argv []) { int c; /* Имя анализируемой опции */ int aflg = 0; /* Признак того, что задана опция a */ int bflg = 0; /* Признак того, что задана опция b */ int errflg = 0; /* Флаг наличия ошибки в командной строке */ int flg = '?'; /* Флаг (a или b), заданный в командной строке */ char *ofile = NULL; /* Указатель на аргумент опции o */ /* Подавим стандартную диагностику */ /* независимо от первого символа */ /* цепочки имен опций */ opterr = 0; while ((c = getopt (argc, argv, ":abo:")) != -1) { switch (c) { case 'a': aflg++; flg = c; if (bflg) { fprintf (stderr, "Опции a и b несовместимы\n"); errflg++; } break; case 'b': bflg++; flg = c; if (aflg) { fprintf (stderr, "Опции a и b несовместимы\n"); errflg++; } break; case 'o': ofile = optarg; break; case ':': fprintf (stderr, "Отсутствует аргумент опции -%c\n", optopt); errflg++; break; case '?': fprintf (stderr, "Недопустимая опция -%c\n", optopt); errflg++; break; } } if (errflg) { (void) fprintf (stderr, "Использование: %s: [-a | -b] [-o выходной_файл] " "[аргумент ...]\n", argv [0]); return (1); } printf ("Заданный флаг: %c\n", flg); printf ("Аргумент опции o: %s\n", ofile); printf ("Остаток командной строки:"); for (; optind < argc; optind++) { printf (" %s", argv [optind]); } printf ("\n"); return 0; }
Листинг 2.35. Пример использования функции getopt().
Закрыть окно



Содержание раздела