Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Linux основные команды. Карманный справочник - Д. Дж. Еаррет

.pdf
Скачиваний:
356
Добавлен:
24.05.2014
Размер:
1.77 Mб
Скачать

Переменные

Переменные мы рассмотрели ранее.

$ 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