KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

используемых совместно с echo и sed

n

перевод строки (новая строка)

r

перевод каретки

t

табуляция

v

вертикальная табуляция

b

забой (backspace)

a

"звонок" (сигнал)

xx

ASCII-символ с кодом 0xx в восьмеричном виде)

Пример 5-2. Экранированные символы

#!/bin/bash

# escaped.sh: экранированные символы


echo; echo


echo "vvvv" # Вывод последовательности символов vvvv.

# Для вывода экранированных символов следует использовать ключ -e.

echo "============="

echo "ВЕРТИКАЛЬНАЯ ТАБУЛЯЦИЯ"

echo -e "vvvv" # Вывод 4-х вертикальных табуляций.

echo "=============="


echo "КАВЫЧКИ"

echo -e "42" # Выводит символ " (кавычки с восьмеричным кодом ASCII 42).

echo "=============="


# Конструкция $'X' делает использование ключа -e необязательным.

echo; echo "НОВАЯ СТРОКА И ЗВОНОК"

echo $'n' # Перевод строки.

echo $'a' # Звонок (сигнал).


echo "==============="

echo "КАВЫЧКИ"

# Bash версии 2 и выше допускает использование конструкции $'nnn'.

# Обратите внимание: здесь под 'nnn' подразумевается восьмеричное значение.

echo $'t 42 t' # Кавычки (") окруженные табуляцией.


# В конструкции $'xhhh' допускается использовать и шестнадцатеричные значения.

echo $'t x22 t' # Кавычки (") окруженные табуляцией.

# Спасибо Greg Keraunen, за это примечание.

# Ранние версии Bash допускали употребление конструкции в виде 'x022'.

echo "==============="

echo


# Запись ASCII-символов в переменную.

# ----------------------------------------

quote=$'42' # запись символа " в переменную.

echo "$quote Эта часть строки ограничена кавычками, $quote а эта -- нет."


echo


# Конкатенация ASCII-символов в переменную.

triple_underline=$'137137137' # 137 -- это восьмеричный код символа '_'.

echo "$triple_underline ПОДЧЕРКИВАНИЕ $triple_underline"


echo


ABC=$'10110210310' # 101, 102, 103 это A, B и C соответственно.

echo $ABC


echo; echo


escape=$'33' # 033 -- восьмеричный код экранирующего символа.

echo ""escape" выводится как $escape"

# вывод отсутствует.


echo; echo


exit 0

Еще один пример использования конструкции $' ' вы найдете в Пример 34-1.

"

кавычки

echo "Привет" # Привет

echo "Он сказал: "Привет"." # Он сказал: "Привет".


$

символ доллара (если за комбинацией символов $ следует имя переменной, то она не будет разыменована)

echo "$variable01" # выведет $variable01


\

обратный слэш

echo "\" # выведет


Поведение символа сильно зависит от того экранирован ли он, ограничен ли кавычками или находится внутри конструкции подстановки команды или во вложенном документе.

# Простое экранирование и кавычки

echo z # z

echo \z # z

echo 'z' # z

echo '\z' # \z

echo "z" # z

echo "\z" # z


# Подстановка команды

echo `echo z` # z

echo `echo \z` # z

echo `echo \z` # z

echo `echo \\z` # z

echo `echo \\\z` # z

echo `echo \\\z` # \z

echo `echo "z"` # z

echo `echo "\z"` # z


# Встроенный документ

cat <<EOF

z

EOF # z


cat <<EOF

\z

EOF # z


# Эти примеры предоставил Stephane Chazelas.


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

variable=

echo "$variable"

# Не работает - дает сообщение об ошибке:

# test.sh: : command not found

# В "чистом" виде экранирующий (escape) символ не может быть записан в переменную.

#

# Фактически, в данном примере, происходит экранирование символа перевода строки

#+ в результате получается такая команда: variable=echo "$variable"

#+ ошибочное присваивание


variable=

23skidoo

echo "$variable" # 23skidoo

# Здесь все в порядке, поскольку вторая строка

#+ является нормальным, с точки зрения присваивания, выражением.


variable=

# ^ За escape-символом следует пробел

echo "$variable" # пробел


variable=\

echo "$variable" #


variable=\

echo "$variable"

# Не работает - сообщение об ошибке:

# test.sh: : command not found

#

# Первый escape-символ экранирует второй, а третий оказывается неэкранированным,

#+ результат тот же, что и в первом примере.


variable=\\

echo "$variable" # \

# Второй и четвертый escape-символы экранированы.

# Это нормально.


Экранирование пробелов предотвращает разбиение списка аргументов командной строки на отдельные аргументы.

file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"

# Список файлов как аргумент(ы) командной строки.


# Добавить два файла в список и вывести список.

ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list


echo "-------------------------------------------------------------------------"


# Что произойдет, если экранировать пробелы в списке?

ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list

# Ошибка: первые три файла будут "слиты" воедино

# и переданы команде 'ls -l' как один аргумент

# потому что два пробела, разделяющие аргументы (слова) -- экранированы.


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

(cd /source/directory && tar cf - . ) |

(cd /dest/directory && tar xpvf -)

# Команда копирования дерева каталогов.

# Разбита на две строки для большей удобочитаемости.


# Альтернативный вариант:

tar cf - -C /source/directory . |

tar xpvf - -C /dest/directory

# См. примечание ниже.

# (Спасибо Stephane Chazelas.)

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


echo "foo

bar"

#foo

#bar


echo


echo 'foo

bar' # Никаких различий.

#foo

#bar


echo


echo foo

bar # Перевод строки экранирован.

#foobar


echo


echo "foo

bar" # Внутри "нестрогих" кавычек символ "" интерпретируется как экранирующий.

#foobar


echo


echo 'foo

bar' # В "строгих" кавычках обратный слэш воспринимается как обычный символ.

#foo

#bar


# Примеры предложены Stephane Chazelas.


Глава 6. Завершение и код завершения

...эта часть Bourne shell покрыта мраком, тем не менее все пользуются ею.

Chet Ramey

Команда exit может использоваться для завершения работы сценария, точно так же как и в программах на языке C. Кроме того, она может возвращать некоторое значение, которое может быть проанализировано вызывающим процессом.

Каждая команда возвращает код завершения (иногда код завершения называют возвращаемым значением ). В случае успеха команда должна возвращать 0, а в случае ошибки -- ненулевое значение, которое, как правило, интерпретируется как код ошибки. Практически все команды и утилиты UNIX возвращают 0 в случае успешного завершения, но имеются и исключения из правил.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*