Linux основные команды. Карманный справочник - Д. Дж. Еаррет
.pdfПеременные
Переменные мы рассмотрели ранее.
$ MYVAR=6
$ echo $MYVAR 6
Все значения, содержащиеся в переменных, являются строками, но если они численные, то командный процессор будет соответственно воспринимать их как числа.
$ NUMBER="10"
$ expr $NUMBER + 5 15
Когда вы ссылаетесь на значение переменной в shell-скрипте, следует помещать ее в двойные кавычки, чтобы избежать определенных ошибок во время его работы. Неопределенная переменная или переменная, у которой в значении есть пробелы, может быть воспринята непредсказуемым образом, если она не будет заключена в кавычки, что приведет к неправильной работе скрипта.
$ |
FILENAME="My Document" |
Пробел в имени |
$ |
Is $FILENAME |
Попробуем вывести ее |
Is: My: No such file or directory |
Ой! Команда Is |
|
|
|
увидела 2 аргумента |
Is: |
Document: No such file or directory |
|
$ Is -1 "$FILENAME" |
Выведем ее правильно |
|
My Document Команда Is |
увидела только l аргумент |
|
Если имя переменной обрабатьшается вместе с другой соседней строкой, поместите ее в фигурные скобки, чтобы избежать непредвиденного результата.
$ НАТ="fedora"
211
$ echo "The plural of $HAT is $HATs" The plural of fedora is Ой!Переменная "HA Ts " отсутствует
$ echo "The plural of $HAT is "${HAT}s"
Ввод и вывод данных
Вывод данных в скриптах осуществляется с помощью команд echo и printf, которые мы описали в разделе "Вывод на экран" на странице 224.
$ echo "Hello world" Hello world
$ printf "Мне %d лет\п" 'expr 20 + 20" Мне 40 лет
Ввод данных в скриптах осуществляется с помощью команды read, которая считывает одну строку из стандартного потока ввода и сохраняет ее в переменной.
$ read name
Sandy Smith <ENTER>
$ echo "I read the name $name" I read the name Sandy Smith
Логические переменные и возвращаемые значения
Для того чтобы описать операторы ветвления и циклы, нам нужно понятие логической (истина/ ложь) проверки. Для командного процессора значение 0 означает "истину" или "успех", а все остальные значения - "ложь" или "неудачу".
Кроме того, каждая Linux-команда при завершении работы возвращает командному процессору целочисленное значение, называемое возвращаемым значением (return code) или статусом выхода (exit status). Вы можете увидеть это значение в специальной переменной $?.
212
$ cat myfile ■
My name is Sandy Smith and I really like Fedora Linux
$ grep Smith myfile
My name is Sandy Smith and Совпадение было найдено... $ echo $?
0 |
...поэтому возвращаемым значением будет |
||
"успех" |
|
|
|
$ |
grep |
aardvark myfile |
|
$ |
echo |
$? |
Совпадений не было найдено... |
1 |
... поэтому возвращаемым значением |
||
будет "неудача"
Возвращаемые значения команды, как правило, описаны на ее man-странице.
test и"["
Команда test (встроенная в командный процессор) обрабатывает простые логические выражения, включающие в себя числа и строки, и, в зависимости от результата, возвращающая значение 0 (истина) или 1 (ложь).
$ |
test |
10 |
-It 5 |
10меньше, чем 5? |
$ echo |
$? |
|
|
|
1Нет |
|
|
|
|
$ |
test |
-n |
"hello" |
Строка "hello"имеет |
ненулевую длину? |
|
|||
$ |
echo $? |
|
|
|
О- --Да
Список наиболее общих аргументов команды test для работы с целыми числами строками и файлами дан в табл. 12.
Команда test имеет необычный псевдоним, символ "[" (левая квадратная скобка), сокращенный вариант для работы с операторами ветвления и циклами. Если вы его используете, то вы должны в качестве последнего аргумента поставить символ "]" (правая квадратная скобка), чтобы обозначить конец команды test.
213
Следующие команды проверки идентичны тем, которые мы рассмотрели выше.
$[ |
10 |
-It 5 |
] |
|
$echo |
$? |
|
||
1 |
|
|
|
|
$[ |
-n |
"hello" |
] |
|
$echo |
$? |
|
||
Запомните, что "[" - это такая же команда, как и остальные, поэтому за ней следуют отдельные аргументы, разделенные пробелами. И если вы случайно забудете пробел:
$ [ 5 -It 4] Отсутствует пробел между аргументами 4 и ] bash: [: missing ']'
то команда test подумает, что последним аргументом является строка "4]", и посчитает, что финальная скобка отсутствует.
260 | Linux. Карманный справочник
Таблица 12. Некоторые общие аргументы команды test
Проверка файлов
-d имя |
|
Файл *«и»является директорией |
|
-f |
имя |
|
Файл /«появляется регулярным файлом |
-L |
имя |
Файл /лияявляется символьной ссылкой |
|
-г |
имя |
|
Файл имя существует и доступен для |
|
|
|
чтения |
-W |
имя |
Файл ни» существует и доступен для |
|
|
|
|
записи |
-х имя |
|
Файл ии» существует и доступен для |
|
|
|
|
выполнения |
-S |
ИМЯ |
Файл имя существует и имеет ненулевую |
|
|
|
|
длину |
fl |
-nt |
f2 |
Файл //более новый, чем файл f2 |
fl |
-ot |
f2 |
Файл //более старый, чем файл 12 |
Проверка строк
si = s2 Строка 5/равна строке s2
214
si |
!= s2 |
Строка 5/не равна строке s2 |
-z |
si |
Строка 5/имеет нулевую длину |
-n |
si |
Строка 5/имеет ненулевую длину |
Проверка чисел
a |
-eq b |
Целые числа а и b равны |
|
a |
-ne |
b |
Целые числа аи Л не равны |
a |
-gt |
b |
Целое число а больше целого числа b |
a |
-ge b |
Целое число а больше или равно целому |
|
|
|
|
числу b |
a |
-It |
b |
Целое число а меньше целого числа b |
a -le b |
Целое число а меньше или равно целому |
||
|
|
|
числу Ь |
Объединение и отрицание при проверке |
|||
tl |
-a |
tl |
И: проверки // и £?возвращают результат |
|
|
|
"истина" |
tl |
-о |
t2 |
ИЛИ: или проверка //, или проверка t2 |
|
|
|
возвращают результат "истина" |
! |
тест |
Отрицание результата проверки, то есть, |
|
|
|
|
когда гесгвозвращает результат "ложь" |
\( |
тест \) |
Круглые скобки используются для |
|
|
|
|
группировки, как в алгебре |
true и false
Командный процессор bash имеет встроенные команды true и false, которые просто возвращают значение 0 и 1 соответственно.
$true |
|
|
|
$echo $? |
|
|
|
О |
|
|
|
$false |
. |
. |
- |
$echo $? |
|
|
|
1 |
' : ' |
|
|
Они будут полезны, когда мы будем рассматривать операторы ветвления и циклы.
Операторы ветвления
215
Этот оператор осуществляет выбор между альтернативами, каждая из которых может содержать сложную проверку. Простейшая форма - это оператор if-then.
i f команда |
|
Если статус выхода команды О then |
||||
тело |
|
|
|
|
|
|
fi |
-.■■,-,... |
|
|
|
|
|
Например: |
|
|
|
|
|
|
if [ |
'whoami4 |
= "root" |
] then |
|
|
|
echo |
"Вы являетесь суперпользователем" fi |
|
||||
Затем идет оператор if-then-else. |
|
|
||||
if команда then |
|
|
|
|
||
тело! else |
|
|
|
|
|
|
тело2 fi |
|
|
|
|
|
|
Например: |
|
|
|
|
|
|
if [ |
4whoami" |
= "root" |
] then |
|
|
|
echo |
" Вы являетесь суперпользователем |
" else |
||||
echo |
"Вы являетесь обычным пользователем" fi |
|||||
Наконец, есть формат if-then-el if-else, в котором можно |
||||||
реализовать столько проверок, сколько вам будет нужно. |
||||||
if команда! then |
|
|
|
|||
тело! |
|
|
|
|
|
|
elif команда2 then |
|
|
|
|||
тело2 elif ... |
|
|
|
|
|
|
else |
|
|
|
|
|
|
TenoN fi |
|
|
|
|
|
|
Например: |
|
|
|
|
|
|
if [ |
'whoami1 |
= "root" |
] then |
|
|
|
echo |
" Вы являетесь суперпользователем |
" elif [ "$USER" |
||||
= "root" |
] then |
|
|
|
|
|
echo |
" Вы, |
должно быть, являетесь суперпользователем " |
||||
elif [ "$bribe" -gt 10000 ] then |
|
|
||||
echo |
" |
Вы |
можете |
заплатить |
за |
то, чтобы стать |
суперпользователем |
" else |
|
|
|
||
echo |
"Вы все еще обычный пользователь" fi |
|||||
Оператор case оценивает одно значение и выполняет соответствующий ему кусок кода.
216
echo |
'Что |
вы хотите |
делать?' read answer case "$answer" in |
|
есть) |
|
|
|
|
echo |
"OK, |
съешьте |
гамбургер" |
|
спать) |
|
|
|
|
echo |
"Тогда спокойной ночи" |
|||
echo |
"Я не |
понимаю, что |
вы хотите сделать" |
|
echo |
"Надеюсь увидимся |
завтра" |
||
esac Общий вид этого оператор таков. |
||||
case |
строка |
in выражение 1) тело! |
||
выражение2) тело2 |
|
|
||
выражениеЮ тело_ИНАЧЕ
Строка - это любое значение, как правило, переменная, например $myvar, а выражения 1-N - это шаблоны (выполните команду info bash reserved case для более подробной информации), а последний шаблон, символ *, выполняет функцию оператора "else" (иначе). Каждый набор команд должен заканчиваться символами;; (как показано).
case $letter in X)
echo "$letter - это буква X" [aeiou])
echo "$letter - это гласная буква" [0-9])
echo "$letter - это цифра" *) ' '
echo "Я не могу обработать это" esac
Циклы
Цикл while повторяет набор команд до тех пор, пока выполняется условие (т. е. пока оно возвращает значение "истина").
while команда Пока команда возвращает значение О do
тело done
Например, рассмотрим скрипт myscript. i=0
217
while [ $i -It 3 ]' .• do
echo "$i"
i=~expr $i +1' done $ ./myscript
0
1
2
Цикл until повторяется до тех порка, пока условие не начнет выполняться (т. е. пока оно не вернет значение "истина"):
until команда Пока команда возвращает ненулевое значение do
тело done |
|
|
Например: |
|
|
i = 0 |
|
|
until |
t $i |
-gt 3 ] |
do |
|
|
echo |
"$i" |
|
i=4expr $i |
+ Г done |
|
$ ./myscript 0 1 2
Цикл for итерирует по значениям из списка. for переменная in список do
тело done Например:
for name in Tom Jack Harry do echo "$name - мой друг" done
$ ./myscript Tom - |
мой друг Jack - мой друг Harry |
- мой |
друг |
|
|
Цикл for особенно |
удобен для обработки списков |
файлов, |
например всех файлов определенного типа в текущей директории. for file in *.doc do
echo "$file - это отвратительный файл Microsoft Word" done Для бесконечного цикла используйте цикл while с условием
true ("истина") или цикл until с условием false ("ложь").
218
while |
true do |
echo |
"навсегда" done |
until |
false do |
echo |
"и снова навсегда" done |
Вероятно, вы будете использовать операторы break или exit для того, чтобы завершить эти циклы при выполнении какого-нибудь условия.
Break и Continue
Команда break осуществляет выход из текущего цикла. Рассмотрим простой скрипт myscript.
for name in Tom Jack Harry do echo $name
echo "снова" done echo "все сделано" $ ./myscript
Tom снова
Jack . : ■ снова Harry снова все сделано
А теперь с оператором break. for name in Tom Jack Harry do
echo |
$name |
|
if [ |
"$name" = "Jack" |
] |
then break |
|
|
fi |
|
|
echo |
"снова" done echo |
"все сделано" |
Tom |
|
|
снова |
|
|
Jack |
Выполнен оператор break |
|
все |
сделано |
|
Команда continue форсирует переход цикла к следующей итерации.
for name in Tom Jack Harry do echo $name
219
if [ "$name" = "Jack" ] then
continue
fi |
|
echo |
"снова" done echo "все сделано" |
$ ./myscript |
|
Tom |
|
снова |
|
Jack |
Выполнен оператор continue |
Harry |
|
снова все сделано
Также операторы break и continue принимают численные аргументы (break N, continue N) для того, чтобы управлять несколькими уровнями циклов (например, выйти из N вложенных друг в друга циклов), но такой стиль написания скриптов приводит к созданию запутанного кода, и мы не рекомендуем его придерживаться.
Создание и запуск shell-скриптов
Для того чтобы создать shell-скрипт, просто поместите команды bash в файл, как будто если бы вы набирали их в командном процессоре. Чтобы запустить скрипт, у вас есть три способа.
Добавить в начале файла строку #!/bin/bash и сделать файл исполняемым
Это самый распространенный способ запуска скриптов. Добавьте строку:
#!/bin/bash
в самом начале файла скрипта. Это должна быть самая первая строка файла, выровненная влево. После этого сделайте файл исполняемым.
$ chmod +x myscript
220
