Например, приводившийся ранее пример командной строки:
cat file_1 grep -h result sort cat -b > file_2
может быть записан в командном файле, скажем, как
cat file_1 grep -h \
result sort cat -b > file_2
Кстати, эффект продолжения командной строки обеспечивает и символ конвейера. В
данном случае это может дать более симпатичный результат, например:
cat file_1
grep -h result
sort
cat -b > file_2
3.3. Манипуляции с shell-переменными
Несмотря на то, что shell-переменные в общем случае воспринимаются как строки,
т. е. "35" - это не число, а строка из двух символов "3" и "5", в раде случаев
они могут интерпретироваться иначе, например, как целые числа.
Разнообразные возможности имеет команда "expr".
Проиллюстрируем некоторые на примерах:
Выполнение командного файла:
x=7 y=2
a=`expr $x + $y` ; echo a=$a
a=`expr $a + 1` ; echo a=$a
b=`expr $y - $x` ; echo b=$b
c=`expr $x '*' $y` ; echo c=$c
d=`expr $x / $y` ; echo d=$d
e=`expr $x % $y` ; echo e=$e
выдаст на экран
a=9
a=10
b=-5
c=14
d=3
e=1
Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в
shell этот значок воспринимается, как спецсимвол, означающий, что на это место
может быть подставлена любая последовательность символов.
С командой "expr" возможны не только (целочисленные) арифметические операции, но
и строковые:
A=`expr 'cocktail' : 'cock'` ; echo $A
B=`expr 'cocktail' : 'tail'` ; echo $B
C=`expr 'cocktail' : 'cook'` ; echo $C
D=`expr 'cock' : 'cocktail'` ; echo $D
На экран будут выведены числа, показывающее число совпадающих символов в
цепочках (от начала). Вторая из строк не может быть длиннее первой :
4
0
0
0
3.4. Экспорт переменных
В ОС UNIX существует понятие процесса. Процесс возникает тогда, когда
запускается на выполнение какая-либо команда.
Например, при наборе на клавиатуре "р <Enter>" порождается процесс "р". В свою
очередь "р" может породить другие процессы. Допустим, что "р" вызывает "р1" и
"р2", которые последовательно порождают соответствующие процессы.
У каждого процесса есть своя среда - множество доступных ему переменных.
Например, до запуска "р" уже существовала среда, в которой уже были определены
некоторые переменные. Запуск "р" порождает новую среду; уже в ней будут
порождены "р1" и "р2".
Переменные локальны в рамках процесса, в котором они объявлены, т.е. где им
присвоены значения. Для того, чтобы они были доступны и другим порождаемым
процессам, надо передать их явным образом. Для этого используется встроенная
команда "export".
3.5. Параметры
В командный файл могут быть переданы параметры. В shell используются позиционные
параметры (т.е. существенна очередность их следования). В командном файле
соответствующие параметрам переменные (аналогично shell-переменным) начинаются с
символа "$", а далее следует одна из цифр от 0 до 9:
Пусть "examp-1" вызывается с параметрами "cock" и "tail". Эти параметры попадают
в новую среду под стандартными именами "1" и "2". В (стандартной) переменной с
именем "0" будет храниться имя вызванного расчета.
При обращении к параметрам перед цифрой ставится символ доллара "$" (как и при
обращении к переменным):
$0 соответствует имени данного командного файла;
$1 первый по порядку параметр;
$2 второй параметр и т.д.
Поскольку число переменных, в которые могут передаваться параметры, ограничено
одной цифрой, т.е. 9-ю ("0", как уже отмечалось имеет особый смысл), то для
передачи большего числа параметров используется специальная команда "shift".
Своеобразный подход к параметрам дает команда "set".
Например, фрагмент
set a b с
echo первый=$1 второй=$2 третий=$3
выдаст на экран
первый=a второй=b третий=c
т.е. команда "set" устанавливает значения параметров. Это бывает очень удобно.
Например, команда "date" выдает на экран текущую дату, скажем, "Mon May 01
12:15:10 2000", состоящую из пяти слов, тогда
set `date`
echo $1 $3 $5
выдаст на экран
Mon 01 2000
Команда "set" позволяет также осуществлять контроль выполнения программы,
например:
set -v на терминал выводятся строки, читаемые shell.
set +v отменяет предыдущий режим.
set -x на терминал выводятся команды перед выполнением.
set +x отменяет предыдущий режим.
Команда "set="Times New Roman">" без параметров выводит на терминал состояние
программной среды.
3.6. Подстановки shell-интерпретатора
Перед началом непосредственной интерпретации и выполнением команд, содержащихся
в командных файлах, shell выполняет различные виды подстановок:
ПОДСТАНОВКА РЕЗУЛЬТАТОВ. Выполняются все команды, заключенные в обратные
кавычки, и на их место подставляется результат.
ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на
"$", заменяются соответствующими значениями переменных и параметров.
ИНТЕРПРЕТАЦИЯ ПРОБЕЛОВ. Заэкранированные пробелы игнорируются.
ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них спецсимволов ("*",
"?","[]") и выполняются соответствующие генерации.
3.7. Программная среда
Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд
переменных этой среды.
Если вы наберете команду "set" без параметров, то на экран будет выдана
информация о ряде стандартных переменных, созданных при входе в систему (и
передаваемых далее всем вашим новым процессам "по наследству"), а также
переменных, созданных и экспортируемых вашими процессами.
Конкретный вид и содержание выдаваемой информации в немалой степени зависит от
того, какая версия UNIX используется и как инсталлирована система.
Результат выполнения команды set без параметров (не полный):
HOME=/root
PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11:
IFS=
LOGNAME=sae
MAIL=/var/spool/mail/sae
PWD=/home/sae/STUDY/SHELL
PS1=${PWD}:" "
PS2=>
SHELL=/bin/bash
Прокомментируем значения переменных.
HOME=/root - это имя домашнего директория, в котором пользователь оказывается
после входа в систему. То есть, правильно набрав имя и пароль, я окажусь в
директории "/root".
PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - эта переменная задает
последовательность файлов, которые просматривает "shell" в поисках команды.
Имена файлов разделяются здесь двоеточиями. Последовательность просмотра
соответствует очередности следования имен в тропе. Но первоначально поиск
происходит среди так называемых встроенных команд. В число встроенных команд
входят наиболее часто используемые команды, например "echo", "cd", "pwd",
"date". После этого система просматривает директорий "/bin", в котором могут
находиться команды "sh", "cp", "mv", "ls" и т.п. Затем директорий "/usr/bin" с
командами "cat", "сс", "expr", "nroff", "man" и многими другими. Далее поиск
происходит в текущем директории (".", или другое обозначение "пусто", т.е.""),
где скорее всего находятся написанные вами команды.
После набора командной строки и нажатия <Enter> "shell" (после выполнения
необходимых подстановок) распознает имя, соответствующее команде и осуществляет
ее поиск в директориях, перечисленных в PATH. Если команда размещена вне этих
директориев, она не будет найдена. Если присутствует несколько команд с
одинаковым именем, то вызвана будет та, которая расположена в директории,
просматриваемом первым.
PATH, как и прочие переменные, можно легко менять, добавляя, переставляя или
исключая директории.
IFS= (Внутренний Разделитель Полей) перечисляет символы, которые служат для
разделения слов (полей). Таковыми являются "пробел", "табуляция" и "перевод
строки", поэтому здесь слева от присваивания ничего не видно и занято две
строки.
LOGNAME=root - имя входа ("имя" пользователя).
MAIL=/var/spool/mail/root - имя файла, в который поступает (электронная) почта.
PWD=/root - имя текущего директория
PS1=${PWD}:" " - вид промтера. В данном случае в промптере будет выдаваться имя
текущего директория двоеточие и пробел. То есть здесь будет "/root: ".
PS2=> - этот промтер (здесь ">") используется как приглашение к продолжению
ввода (в очередной строке) незаконченной команды. Например, наберите открывающую
скобку "(" и после нажатия <Enter> в следующей строке вы увидите этот промптер.
Если пока не знаете, что дальше делать, наберите закрывающую скобку ")" и он
исчезнет.
SHELL=/bin/sh - эта переменная указывает оболочку, которую использует
пользователь. В данном случае используется стандартный shell ("sh").
Исходная среда устанавливается автоматически при входе в систему с
использованием файлов типа "/etc/rc" и "/etc/.profile".
Один из способов просто изменит среду (например, тропу поиска команд, вид
промтера, вид оболочки, цвет экрана и т.п.) можно, разместив эту информацию в
своем домашнем директории в специализированном файле ".profile"
(${HOME}/.profile), присвоив нужные значения переменным среды. То есть вызвать
это файл в редактор и написать, что пожелаете). Тогда при каждом вашем входе в
систему этот файл будет автоматически выполняться и устанавливать новую среду.
Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем ДОМАШНЕМ директории (директории
входа).
Следует иметь в виду, что имена файлов, начинающиеся с точки, вообще имеют
особый статус. Так, они не выдаются на экран простой командой "ls" - необходимо
вызывать эту команду с флагом "-a". Кстати, и не уничтожаются огульно командой
"rm *".
Сам интерпретатор shell автоматически присваивает значения следующим переменным
(параметрам):
?значение, возвращенное последней командой;
$номер процесса;
!номер фонового процесса;
#число позиционных параметров, передаваемых в shell;