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

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

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

выводит (на stdout) выражение или содержимое переменной (см. Пример 4-1).

echo Hello

echo $a


Для вывода экранированных символов, echo требует наличие ключа -e. См. Пример 5-2.

Обычно, командв echo выводит в конце символ перевода строки. Подавить вывод это символа можно ключом -n.

Команда echo может использоваться для передачи информации по конвейеру другим командам.

if echo "$VAR" | grep -q txt # if [[ $VAR = *txt* ]]

then

echo "$VAR содержит подстроку "txt""

fi


Кроме того, команда echo, в комбинации с подстановкой команд может учавствовать в операции присвоения значения переменной.

a=`echo "HELLO" | tr A-Z a-z`

См. так же Пример 12-15, Пример 12-2, Пример 12-32 и Пример 12-33.

Следует запомнить, что команда echo `command` удалит все символы перевода строки, которые будут выведены командой command.

Переменная $IFS обычно содержит символ перевода строки n, как один из вариантов пробельного символа. Bash разобьет вывод команды command, по пробельным символам, на аргументы и передаст их команде echo, которая выведет эти аргументы, разделенные пробелами.

bash$ ls -l /usr/share/apps/kjezz/sounds

-rw-r--r-- 1 root root 1407 Nov 7 2000 reflect.au

-rw-r--r-- 1 root root 362 Nov 7 2000 seconds.au


bash$ echo `ls -l /usr/share/apps/kjezz/sounds`

total 40 -rw-r--r-- 1 root root 716 Nov 7 2000 reflect.au -rw-r--r-- 1 root root 362 Nov 7 2000 seconds.au


Это встроенная команда Bash и имеет внешний аналог /bin/echo.

bash$ type -a echo

echo is a shell builtin

echo is /bin/echo


printf

printf -- команда форматированного вывода, расширенный вариант команды echo и ограниченный вариант библиотечной функции printf() в языке C, к тому же синтаксис их несколько отдичается друг от друга.

printf format-string... parameter...

Это встроенная команда Bash. Имеет внешний аналог /bin/printf или /usr/bin/printf. За более подробной информацией обращайтесь к страницам справочного руководства man 1 printf по системным командам.

Старые версии Bash могут не поддерживать команду printf.

Пример 11-1. printf в действии

#!/bin/bash

# printf demo


# От переводчика:

# Считаю своим долгом напомнить, что в качестве разделителя дробной и целой

# частей в вещественных числах, может использоваться символ "запятая"

# (в русских локалях), поэтому данный сценарий может выдавать сообщение

# об ошибке (у меня так и произошло) при выводе числа PI.

# Тогда попробуйте заменить в определении числа PI десятичную точку

# на запятую -- это должно помочь. ;-)


PI=3,14159265358979

DecimalConstant=31373

Message1="Поздравляю,"

Message2="Землянин."


echo


printf "Число пи с точностью до 2 знака после запятой = %1.2f" $PI

echo

printf "Число пи с точностью до 9 знака после запятой = %1.9f" $PI # Даже округляет правильно.


printf "n" # Перевод строки,


printf "Константа = t%dn" $DecimalConstant # Вставлен символ табуляции (t)


printf "%s %s n" $Message1 $Message2


echo


# ==========================================#

# Эмуляция функции 'sprintf' в языке C.

# Запись форматированной строки в переменную.


echo


Pi12=$(printf "%1.12f" $PI)

echo "Число пи с точностью до 12 знака после запятой = $Pi12"


Msg=`printf "%s %s n" $Message1 $Message2`

echo $Msg; echo $Msg


exit 0

Одно из полезных применений команды printf -- форматированный вывод сообщений об ошибках

E_BADDIR=65


var=nonexistent_directory


error()

{

printf " [email protected]" >&2

# Форматированный вывод аргументов на stderr.

echo

exit $E_BADDIR

}


cd $var || error $"Невозможно перейти в каталог %s." "$var"


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


read

"Читает" значение переменной с устройства стандартного ввода -- stdin, в интерактивном режиме это означает клавиатуру. Ключ -a позволяет записывать значения в массивы (см. Пример 25-3).

Пример 11-2. Ввод значений переменных с помощью read

#!/bin/bash


echo -n "дите значение переменной 'var1': "

# Ключ -n подавляет вывод символа перевода строки.


read var1

# Обратите внимание -- перед именем переменной отсутствует символ '$'.


echo "var1 = $var1"


echo


# Одной командой 'read' можно вводить несколько переменных.

echo -n "дите значения для переменных 'var2' и 'var3' (через пробел или табуляцию): "

read var2 var3

echo "var2 = $var2 var3 = $var3"

# Если было введено значение только одной переменной, то вторая останется "пустой".


exit 0

Если команде read не была передано ни одной переменной, то ввод будет осуществлен в переменную $REPLY.

Пример 11-3. Пример использования команды read без указания переменной для ввода

#!/bin/bash


echo


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

# Первый блок кода.

echo -n "Введите значение: "

read var

echo ""var" = "$var""

# Здесь нет ничего неожиданного.

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


echo


echo -n "Введите другое значение: "

read # Команда 'read' употребляется без указания переменной для ввода,

#+ тем не менее...

#+ По-умолчанию ввод осуществляется в переменную $REPLY.

var="$REPLY"

echo ""var" = "$var""

# Эта часть сценария эквивалентна первому блоку, выделенному выше.


echo


exit 0

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

Пример 11-4. Ввод многострочного текста с помощью read

#!/bin/bash


echo


echo "Введите строку, завершающуюся символом \, и нажмите ENTER."

echo "Затем введите вторую строку, и снова нажмите ENTER."

read var1 # При чтении, символ "" экранирует перевод строки.

# первая строка

# вторая строка


echo "var1 = $var1"

# var1 = первая строка вторая строка


# После ввода каждой строки, завершающейся символом "",

# вы можете продолжать ввод на другой строке.


echo; echo


echo "Введите другую строку, завершающуюся символом \, и нажмите ENTER."

read -r var2 # Ключ -r заставляет команду "read" воспринимать ""

# как обычный символ.

# первая строка


echo "var2 = $var2"

# var2 = первая строка


# Ввод данных прекращается сразу же после первого нажатия на клавишу ENTER.


echo


exit 0

Команда read имеет ряд очень любопытных опций, которые позволяют выводить подсказку - приглашение ко вводу (prompt), и даже читать данные не дожидаясь нажатия на клавишу ENTER.

# Чтение данных, не дожидаясь нажатия на клавишу ENTER.


read -s -n1 -p "Нажмите клавишу " keypress

echo; echo "Была нажата клавиша ""$keypress""."


# -s -- подавляет эхо-вывод, т.е. ввод с клавиатуры не отображается на экране.

# -n N -- ввод завершается автоматически, сразу же после ввода N-го символа.

# -p -- задает вид строки подсказки - приглашения к вводу (prompt).


# Использование этих ключей немного осложняется тем, что они должны следовать в определенном порядке.


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

Пример 11-5. Обнаружение нажатия на курсорные клавиши

#!/bin/bash

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