Операционная система Free BSD

Базовые возможности командных интерпретаторов


Для определенности, в данной главе будем рассматривать интерпретатор bash. Если вам больше нравится работать и программировать в другой оболочке, можете в принципе пропустить изучение этой главы курса. Но замечу, что базовые возможности разных оболочек примерно одинаковые.

Переменные и подстановка значений

Все переменные в языке shell - текстовые. Их имена должны начинаться с буквы и могут состоять из латинских букв, цифр и знака подчеркивания (_). Bash поддерживает как простые переменные, так и массивы. Для установки переменной используется оператор =:

Для простых переменных <имя>=<значение>

Для массивов <имя>[индекс]=<значение>, либо <имя>=(<значение1> <значение2> : <значениеN>), либо <имя>=([индекс1]=<значение1> [индекс2]=<значение2> : [индексN]=<значениеN>)

Чтобы воспользоваться значением переменной, надо перед ней поставить символ $. Можно также заключить переменную в фигурные скобки {}.

Например:

# hour=14 # echo $hour 14 # hourth=24 # echo $hourth 24 # echo ${hour}th 14th

Двойные кавычки ( " ), одиночные кавычки ( ' ), обратные кавычки ( ` ) Кавычки могут использоваться для создания строк. Например: "Hello, world!" 'Good bye'

Кроме того, кавычки могут отменять действие следующих специальных символов: ` ~ ! # $ % ^ & * ( ) - + = \ | ; ' " , . < > ?

Значения этих специальных символов в строках, заключенных в одиночные кавычки '<строка>' отменяются. В строках, заключенных в двойные кавычки "<строка>" также отменяются значения специальных символов, за исключением ! $ ` \ {. Обратная наклонная черта \ также отменяет действие специальных символов.

Не путайте одиночные и обратные кавычки. Пример: # dat=`date` (здесь стоят обратные кавычки) # echo $dat Mon Jun 05 14:17:20 2000

# dat='date' (здесь стоят одиночные кавычки) # echo $dat date



Конвейеры и списки

Несколько команд могут быть объединены с помощью символов канала |. В этом случае они образуют конвейер. <команда1> | <команда2> | <команда3> :


Символ канала | соединяет стандартный вывод команды <команда1> со стандартным вводом команды <команда2> и т.д.

Каждая команда выполняется в отдельном процессе, а состояние выхода последней команды будет являться состоянием выхода конвейера.

Примеры:

# ps -ax | more # ls -l | grep "profile"

Кроме конвейеров, команды могут объединяться в списки. Даже сами конвейеры могут быть объединены в списки. Это делается с помощью команд ; && .

Команда ; просто последовательно выполняет оду команду или конвейер за другой (другим): # make depend ; make ; make install # cat /etc/passwd | grep root ; echo "User root"

Для того, чтобы управлять выполнением следующей команды в списке в зависимости от состояния выхода предыдущей, используются команды && (логическое И) и (логическое ИЛИ).

Примеры:

# mkdir mydir && cd mydir

В этом случае команда cd mydir будет выполнена только в том случае, если успешно (состояние выхода равно 0) завершится команда mkdir mydir. # cat /home/bob/.profile echo "Нет файла .profile"

В этом случае либо на экран будет выведено содержимое файла /home/bob/.profile, либо сообщение о том, что такого файла нет.


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