Книга: Искусство программирования на языке сценариев командной оболочки

Глава 3. Служебные символы

Служебные символы, используемые в текстах сценариев.

#

Комментарии. Строки, начинающиеся с символа # (за исключением комбинации #!) -- являются комментариями.

# Эта строка -- комментарий.

Комментарии могут располагаться и в конце строки с исполняемым кодом.

echo "Далее следует комментарий." # Это комментарий.

Комментариям могут предшествовать пробелы (пробел, табуляция).

# Перед комментарием стоит символ табуляции.


Исполняемые команды не могут следовать за комментарием в той же самой строке. Пока что еще не существует способа отделения комментария от "исполняемого кода", следующего за комментарием в той же строке.


Само собой разумеется, экранированный символ # в операторе echo не воспринимается как начало комментария. Более того, он может использоваться в операциях подстановки параметров и в константных числовых выражениях.

echo "Символ # не означает начало комментария."

echo 'Символ # не означает начало комментария.'

echo Символ # не означает начало комментария.

echo А здесь символ # означает начало комментария.

echo ${PATH#*:} # Подстановка -- не комментарий.

echo $(( 2#101011 )) # База системы счисления -- не комментарий.

# Спасибо, S.C.

Кавычки " ' и экранируют действие символа #.

В операциях поиска по шаблону символ # так же не воспринимается как начало комментария.

Разделитель команд. [Точка-с-запятой] Позволяет записывать две и более команд в одной строке.

echo hello; echo there

Следует отметить, что символ ";" иногда так же как и # необходимо экранировать.

Ограничитель в операторе выбора case . [Двойная-точка-с-запятой]

case "$variable" in

abc) echo "$variable = abc" ;;

xyz) echo "$variable = xyz" ;;

esac

.

команда "точка". Эквивалент команды source (см. Пример 11-18). Это встроенная команда bash.

.

"точка" может являться частью имени файла . Если имя файла начинается с точки, то это "скрытый" файл, т.е. команда ls при обычных условиях его не отображает.

bash$ touch .hidden-file

bash$ ls -l

total 10

-rw-r--r-- 1 bozo 4034 Jul 18 22:04 data1.addressbook

-rw-r--r-- 1 bozo 4602 May 25 13:58 data1.addressbook.bak

-rw-r--r-- 1 bozo 877 Dec 17 2000 employment.addressbook

bash$ ls -al

total 14

drwxrwxr-x 2 bozo bozo 1024 Aug 29 20:54 ./

drwx------ 52 bozo bozo 3072 Aug 29 20:51 ../

-rw-r--r-- 1 bozo bozo 4034 Jul 18 22:04 data1.addressbook

-rw-r--r-- 1 bozo bozo 4602 May 25 13:58 data1.addressbook.bak

-rw-r--r-- 1 bozo bozo 877 Dec 17 2000 employment.addressbook

-rw-rw-r-- 1 bozo bozo 0 Aug 29 20:54 .hidden-file

Если подразумевается имя каталога, то одна точка означает текущий каталог и две точки -- каталог уровнем выше, или родительский каталог.

bash$ pwd

/home/bozo/projects

bash$ cd .

bash$ pwd

/home/bozo/projects

bash$ cd ..

bash$ pwd

/home/bozo/

Символ точка довольно часто используется для обозначения каталога назначения в операциях копирования/перемещения файлов.

bash$ cp /home/bozo/current_work/junk/* .

Символ "точка" в операциях поиска. При выполнении поиска по шаблону , в регулярных выражениях, символ "точка" обозначает одиночный символ.

"

Двойные кавычки . В строке "STRING", ограниченной двойными кавычками не выполняется интерпретация большинства служебных символов, которые могут находиться в строке. см. Глава 5.

'

Одинарные кавычки . [Одинарные кавычки] 'STRING' экранирует все служебные символы в строке STRING. Это более строгая форма экранирования. Смотрите так же Глава 5.

,

Запятая . Оператор запятая используется для вычисления серии арифметических выражений. Вычисляются все выражения, но возвращается результат последнего выражения.

let "t2 = ((a = 9, 15 / 3))" # Присваивает значение переменной "a" и вычисляет "t2".

escape. [обратный слэш] Комбинация X "экранирует" символ X. Аналогичный эффект имеет комбинация с "одинарными кавычками", т.е. 'X'. Символ может использоваться для экранирования кавычек " и '.

Более детальному рассмотрению темы экранирования посвящена Глава 5.

/

Разделитель, используемый в указании пути к каталогам и файлам. [слэш] Отделяет элементы пути к каталогам и файлам (например /home/bozo/projects/Makefile).

В арифметических операциях -- это оператор деления.

`

Подстановка команд. [обратные кавычки] Обратные кавычки могут использоваться для записи в переменную команды `command`.

:

пустая команда. [двоеточие] Это эквивалент операции "NOP" (no op, нет операции). Может рассматриваться как синоним встроенной команды true. Команда ":" так же является встроенной командой Bash, которая всегда возвращает "true" (0).

:

echo $? # 0

Бесконечный цикл:

while :

do

operation-1

operation-2

...

operation-n

done

# То же самое:

# while true

# do

# ...

# done

Символ-заполнитель в условном операторе if/then:

if condition

then : # Никаких действий не производится и управление передается дальше

else

take-some-action

fi

Как символ-заполнитель в операциях, которые предполагают наличие двух операндов, см. Пример 8-2 и параметры по-умолчанию.

: ${username=`whoami`}

# ${username=`whoami`} без символа : выдает сообщение об ошибке,

# если "username" не является командой...

Как символ-заполнитель для оператора вложенного документа. См. Пример 17-9.

В операциях с подстановкой параметров (см. Пример 9-13).

: ${HOSTNAME?} ${USER?} ${MAIL?}

#Вывод сообщения об ошибке, если одна или более переменных не определены.

В операциях замены подстроки с подстановкой значений переменных.

В комбинации с оператором > (оператор перенаправления вывода), усекает длину файла до нуля. Если указан несуществующий файл -- то он создается.

: > data.xxx # Файл "data.xxx" -- пуст

# Тот же эффект имеет команда cat /dev/null >data.xxx

# Однако в данном случае не производится создание нового процесса, поскольку ":" является встроенной командой.

См. так же Пример 12-11.

В комбинации с оператором >> -- оператор перенаправления с добавлением в конец файла и обновлением времени последнего доступа (: >> new_file). Если задано имя несуществующего файла, то он создается. Эквивалентно команде touch.


Вышеизложенное применимо только к обычным файлам и неприменимо к конвейерам, символическим ссылкам и другим специальным файлам.

Символ : может использоваться для создания комментариев, хотя и не рекомендуется. Если строка комментария начинается с символа #, то такая строка не проверяется интерпретатором на наличие ошибок. Однако в случае оператора : это не так.

: Это комментарий, который генерирует сообщение об ошибке, ( if [ $x -eq 3] ).

Символ ":" может использоваться как разделитель полей в /etc/passwd и переменной $PATH.

bash$ echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

!

инверсия (или логическое отрицание) используемое в условных операторах. Оператор ! инвертирует код завершения команды, к которой он применен. (см. Пример 6-2). Так же используется для логического отрицания в операциях сравнения, например, операция сравнения "равно" ( = ), при использовании оператора отрицания, преобразуется в операцию сравнения -- "не равно" ( != ). Символ ! является зарезервированным ключевым словом BASH.

В некоторых случаях символ ! используется для косвенного обращения к переменным.

Кроме того, из командной строки оператор ! запускает механизм историй Bash (см. Приложение F). Примечательно, что этот механизм недоступен из сценариев (т.е. исключительно из командной строки).

*

символ-шаблон. [звездочка] Символ * служит "шаблоном" для подстановки в имена файлов. Одиночный символ * означает любое имя файла в заданном каталоге.

bash$ echo *

abs-book.sgml add-drive.sh agram.sh alias.sh

В регулярных выражениях токен * представляет любое количество (в том числе и 0) символов.

*

арифметический оператор. В арифметических выражениях символ * обозначает операцию умножения.

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

?

Оператор проверки условия. В некоторых выражениях символ ? служит для проверки выполнения условия.

В конструкциях с двойными скобками, символ ? подобен трехместному оператору языка C. См. Пример 9-28.

В выражениях с подстановкой параметра, символ ? проверяет -- установлена ли переменная.

?

сивол-шаблон. Символ ? обозначает одиночный символ при подстановке в имена файлов. В регулярных выражениях служит для обозначения одиночного символа.

$

Подстановка переменной.

var1=5

var2=23skidoo

echo $var1 # 5

echo $var2 # 23skidoo

Символ $, предшествующий имени переменной, указывает на то, что будет получено значение переменной.

$

end-of-line (конец строки). В регулярных выражениях, символ "$" обозначает конец строки.

${}

Подстановка параметра.

$*, $@

параметры командной строки.

$?

код завершения. Переменная $? хранит код завершения последней выполненной команды, функции или сценария.

$$

id процесса. Переменная $$ хранит id процесса сценария.

группа команд.

(a=hello; echo $a)


Команды, заключенные в круглые скобки исполняются в дочернем процессе -- subshell-е.

Переменные, создаваемые в дочернем процессе не видны в "родительском" сценарии. Родительский процесс-сценарий, не может обращаться к переменным, создаваемым в дочернем процессе.

a=123

( a=321; )

echo "a = $a" # a = 123

# переменная "a" в скобках подобна локальной переменной.

инициализация массивов.

Array=(element1 element2 element3)

{xxx,yyy,zzz,...}

Фигурные скобки.

grep Linux file*.{txt,htm*}

# Поиск всех вхождений слова "Linux"

# в файлах "fileA.txt", "file2.txt", "fileR.html", "file-87.htm", и пр.

Команда интерпретируется как список команд, разделенных точкой с запятой, с вариациями, представленными в фигурных скобках.[ 11 ] При интерпретации имен файлов (подстановка) используются параметры, заключенные в фигурные скобки.


Использование неэкранированных или неокавыченных пробелов внутри фигурных скобок недопустимо.

echo {file1,file2} :{ A," B",' C'}

file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

{}

Блок кода. [фигурные скобки] Известен так же как "вложенный блок", эта конструкция, фактически, создает анонимную функцию. Однако, в отличии от обычных функций, переменные, создаваемые во вложенных блоках кода, доступны объемлющему сценарию.

bash$ { local a; a=123; }

bash: local: can only be used in a function

a=123

{ a=321; }

echo "a = $a" # a = 321 (значение, присвоенное во вложенном блоке кода)

# Спасибо, S.C.

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

Оглавление книги


Генерация: 0.047. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз