Bash учебное пособие. Часть 7: Подмножества и части строк. Размеры

Подмножества и части строк

Обычно расширение имеет такую форму: ${PARAMETER:OFFSET:LENGTH}, где аргумент LENGTH необязателен. Итак, если вы хотите выбрать только определенное подмножество аргументов скрипта, вы можете использовать полную версию, чтобы показать, сколько аргументов следует выбрать. Например, ${@:4:3} обращается к трем аргументам, начиная с аргумента 4, а именно, к аргументам 4, 5 и 6. Вы можете использовать это расширение для выбора конкретных параметров помимо тех, которые доступны сразу, используя от $1 до $9 включительно. ${@:15:1} — способ вызова сразу 15 параметра.

Вы можете использовать расширение с конкретными параметрами, а также весь набор параметров, представленный при помощи $* или $@. В этом случае параметр обрабатывается как строка и число, представляющее собой сдвиг или длину. Например, если переменная x имеет значение «some value», то

${x:3:5}

будет иметь значение «e val».

Подстроки значений параметров в shell

[root@httpd ~]$ x=»some value»
[root@httpd ~]$ echo «${x:3:5}»
e val

Размеры

Вы уже видели, что $# указывает число параметров и что расширение ${PARAMETER:OFFSET:LENGTH} применяется и к конкретным параметрам, и к $* и $@, поэтому вас не должно удивить, что аналогичная конструкция, ${#PARAMETER}, может использоваться для определения размера конкретного параметра. Простая функция testlength, показанная в Листинге 10, иллюстрирует это. Попробуйте сделать это сами.

Параметр lengths

[root@httpd ~]$ testlength () { for p in «$@»; do echo ${#p};done }
[root@httpd ~]$ testlength 1 abc «def ghi»
1
3
7

Работа с шаблонами

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

Расширение шаблонов в shell Расширение Назначение

${ПАРАМЕТР#СЛОВО} Shell расширяет СЛОВО как расширение имени файла и удаляет самое короткое соответствие шаблону, если оно имеется, с начала расширенного значения ПАРАМЕТРА. Использование ‘@’ или ‘$’ приводит к удалению по образцу для каждого параметра в списке.
${ПАРАМЕТР##СЛОВО} Приводит к удалению самого длинного соответствия шаблону с начала вместо самого короткого.
${ПАРАМЕТР%СЛОВО} Shell расширяет СЛОВО как расширение имени файла и удаляет самое короткое соответствие шаблону, если оно имеется, с конца расширенного значения ПАРАМЕТРА. Использование ‘@’ или ‘$’ приводит к удалению по образцу для каждого параметра в списке.
${ПАРАМЕТР%%СЛОВО} Приводит к удалению самого длинного соответствия шаблону с конца вместо самого короткого.
${ПАРАМЕТР/ОБРАЗЕЦ/ПОСЛЕДОВАТЕЛЬНОСТЬ} Shell расширяет ОБРАЗЕЦ как расширение имени файла и заменяет самое длинное соответствие шаблону, если оно имеется, расширенным значением ПАРАМЕТРА. Для соответствия образцам в начале расширенного значения ПАРАМЕТРА поставьте в начале ОБРАЗЦА # или %, если соответствие должно проверяться до конца. Если ПОСЛЕДОВАТЕЛЬНОСТЬ пуста, перемещение / может быть опущено и соответствия удаляются. Использование ‘@’ или ‘$’ приводит к замене образца для каждого параметра в списке.
${ПАРАМЕТР//ОБРАЗЕЦ/ПОСЛЕДОВАТЕЛЬНОСТЬ} Выполняет замену для всех подходящих, а не только для первого.

Примеры шаблонов

[root@httpd ~]$ x=»a1 b1 c2 d2″
[root@httpd ~]$ echo ${x#*1}
b1 c2 d2
[root@httpd ~]$ echo ${x##*1}
c2 d2
[root@httpd ~]$ echo ${x%1*}
a1 b
[root@httpd ~]$ echo ${x%%1*}
a
[root@httpd ~]$ echo ${x/1/3}
a3 b1 c2 d2
[root@httpd ~]$ echo ${x//1/3}
a3 b3 c2 d2
[root@httpd ~]$ echo ${x//?1/z3}
z3 z3 c2 d2

Часть 1: скрипт Hellow World
Часть 2: Переменные
Часть 3: Специальные параметры
Часть 4: Одинарные и двойные кавычки. Математические операции
Часть 5: Структурные конструкции и команда test
Часть 6: Структура If…then…else
Часть 7: Подмножества и части строк. Размеры

Bash учебное пособие. Часть 6: Структура If…then…else

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

If…then…else…fi синтаксис:

if [ условие ]
then
 если условие справедливо
 выполнить все команды до else или
 до fi
else
 если условие не справедливо
 выполнить все команды до fi
fi

Очень важно запомнить, ваша конструкция должна всегда заканчиваться на словом fi!

Выражения используемые с if

В приведенной внизу таблице содержаться операторы которые выполняют команду test или набор команд. Эти операторы заключаются в квадратные скобки [] для проверки выполнения условия.

[ -a FILE ] Правда елси FILE существует.
[ -b FILE ] Правда елси FILE существует и это специальный блоковый файл.
[ -c FILE ] Правда елси FILE существует и это специальный знаковый файл.
[ -d FILE ] Правда елси FILE существует и это директория.
[ -e FILE ] Правда елси FILE существует.
[ -f FILE ] Правда елси FILE существует и это регулярный файл.
[ -g FILE ] Правда елси FILE существует и установлен SGID бит.
[ -h FILE ] Правда елси FILE существует и это символический ссылка.
[ -k FILE ] Правда елси FILE существует и второй промежуточный бит округления установлен.
[ -p FILE ] Правда елси FILE существует и это named pipe (FIFO).
[ -r FILE ] Правда елси FILE существует и он доступен на чтение.
[ -s FILE ] Правда елси FILE существует и больше нуля.
[ -u FILE ] Правда елси FILE существует и SUID (set user ID) бит установлен.
[ -w FILE ] Правда елси FILE существует и он доступен на запись.
[ -x FILE ] Правда елси FILE существует и он доступен на исполнение.
[ -O FILE ] Правда елси FILE существует принадлежит существующему пользователю
[ -G FILE ] Правда елси FILE существует принадлежит существующей группе.
[ -L FILE ] Правда елси FILE существует и это символический ссылка.
[ -N FILE ] Правда елси FILE существует и был изменен с тех пор как был прочитан.
[ -S FILE ] Правда елси FILE существует и это сокет.
[ FILE1 -nt FILE2 ] Правда, если файл FILE1 изменялся чаще чем FILE2, или есои FILE1 существует, а FILE2 нет.
[ FILE1 -ot FILE2 ] Правда, если файл FILE1 старше чем FILE2, или FILE1 существует, а FILE2 нет.
[ FILE1 -ef FILE2 ] Правда, если FILE1 и FILE2 относятся к одному устройству и номеру инода.
[ -o OPTIONNAME ] Правда если shell опция "OPTIONNAME" включена.
[ -z STRING ] Правда если длинна "STRING" равна 0.
[ -n STRING ] or [ STRING ] Правда если длинна "STRING" не равна 0.
[ STRING1 == STRING2 ] Правда если выражения эквивалентны. 
[ STRING1 != STRING2 ] Правда если выражения не эквивалентны.
[ STRING1 < STRING2 ] Правда если "STRING1" лексикографически упорядоченно до "STRING2".
[ STRING1 > STRING2 ] Правда если "STRING1" лексикографически упорядоченно после "STRING2".
[ ARG1 OP ARG2 ] "OP" это один из следующих параметров -eq, -ne, -lt, -le, -gt or -ge. Эти бинарные арифметические 
операторы возвращают результат "правда" если "ARG1" эквивалентен(-eq), не эквивалентен(-ne), меньше чем(-lt), 
меньше или эквивалентен(-le), больше чем(-gt), больше или эквивалентно(-ge) к "ARG2".  
[ ! EXPR ] правда если выражение EXPR не справедливо.
[ ( EXPR ) ] возвращает значение EXPR. Это может быть использовано для изменения приоритета операторов.
[ EXPR1 -a EXPR2 ] правда, если оба выражения EXPR1 и EXPR2 справедливы.
[ EXPR1 -o EXPR2 ] правда, если хотя бы одно выражение EXPR1 или EXPR2 справедливы.

Давайте перейдем к примерам. Создадим скрипт который будет определять положительное или отрицательное введенное нами число:

#!/bin/bash
read -p "Введите число : " n
if [ $n -ge 0 ];
then
	echo "$n положительное число."
else
	echo "$n отрицательное число."
fi

другой пример, определим, существует ли введенный нами пользователь:

#!/bin/bash
read -p "Введите имя пользователя : " USER
if ! grep $USER /etc/passwd
then
	echo "$n не существует."
else
	echo "$n существует."
fi

Восклицательный знак перед grep $USER /etc/passwd, говорит о том, что условие выполниться если пользователя не существует. А теперь давайте перепишем этот скрипт только используя специальный параметр $? который мы рассматривали в третем уроке:

#!/bin/bash
read -p "Введите имя пользователя : " USER
grep $USER /etc/passwd
if [ $? -ne 0 ]; 
then
	echo "$n не существует."
else
	echo "$n существует."
fi

Пример использование сравнения строк. скрипт будет проверять root вы или нет:

#!/bin/bash
if [ "$(whoami)" != 'root' ]; then
        echo "У вас нет прав для запуска $0."
        exit 1;
fi

данный скрипт можно переписать короче:

#!/bin/bash
[ "$(whoami)" != 'root' ] && ( echo У вас нет прав для запуска; exit 1 )

Вы так же можете использовать регулярные выражения. Как пример. пускай наш скрипт определяет содержит ли введенный нам текст букву «ч»:

#!/bin/bash
LATTER="ч"
read -p "Введите предложение : " STR
if [[ "$STR" == *$LATTER* ]]; 
then
	echo "$LATTER найдено."
else
	echo "$LATTER не найдено."
fi

Несколько слов по поводу использования двойных и одинарных квадратных скобок. При использовании двойных скобок ваши переменный не будут разбиты на несколько отдельных слов если вы использовали пробел, как пример, переменная VAR=»var with space» будет единым целым.

Часть 1: скрипт Hellow World
Часть 2: Переменные
Часть 3: Специальные параметры
Часть 4: Одинарные и двойные кавычки. Математические операции
Часть 5: Структурные конструкции и команда test
Часть 6: Структура If…then…else
Часть 7: Подмножества и части строк. Размеры

Bash учебное пособие. Часть 5: Структурные конструкции и команда test

Структурные конструкции в bash

В bash вы можете использовать команду if для проверки состояния. Как пример, предположим что вам необходимо сделать бакап в пятницу ночью и для этого вы должны выполнить команду mysqldump.Структура тогда будет такой —

If today Friday ---> then execute mysqldump
		|
		|
	Otherwise ---> echo an error message on screen

Немного о логике

Нужно помнить, что структура выполнения скрипта последовательная, тоесть, пока не будет завершено какое-то действие следующее действие не начнет выполнятьсяю
Каждая команда и/или выполняеться один раз в последовательном порядке
Вы не сможете написать комплексное приложение используя последовательные скрипты
Тем не мение, с помощью команды if вы сможете выборочно запускать определенные команды или части вашего скрипта
При помощи команды if вы можете сделать ваш скрипт более инрактивным и сообзать об возникших ошибках

Нужно так же четко понимать что такое «состояние». Состояние есть не что иное как результат выражения в логической форме, тоесть ложь или истина(true, false). Тоесть, другими словами состаяние может быть правдой или ложью. Простейший пример :

echo $(( 5 < 2 ))

результатом будет 0. bash сравнивает два числа и возвращает результат правда или ложь. В нашем случаи результа — ложь. Необходимо запомнить, что в bash-e 0 это ложь, а 1 это правда.

Команда Test

Команда test используеться для проверки состояния фалов, сравнения строк и арефметических сравнений.

Синтаксис соманды test:

test condition

или

test condition && true-command

или

test condition || false-command

или

test condition && true-command || false-command

Давайте расмори два таких пример. Введите в командной строке:

test 5 -gt 2 && echo "Yes"  
test 1 -gt 2 && echo "Yes"

В первом случаи, так как 5 больше 2 — правда, мы увидим «Yes». Во втором, так как 1 больше 2 — ложь, то, мы ничего не увидим. Тоесть, в случаи если состояние равно 1 у нас выполняеться команда стоящая после &&. Если вам необходимо выполнять какую-то команду в случаи состояния равного 0, то необходимо использовать ||. Покажу вам на примере:

test "$a" == "$b" && echo "Yes" || echo "No"

В данном примере если $a равно $b то выполниться echo «Yes» и на экране мы увидим «Yes», если же $a не равно $b, то выполниться echo «No» и на экране мы увидим «No»

Операторы команды test при числовом сравнении:

Оператор	Синтаксис 					Описание  
eq 		INTEGER1 -eq INTEGER2		INTEGER1 эквивалентно INTEGER2 
ge 		INTEGER1 -ge INTEGER2		INTEGER1 больше или эквивалентно INTEGER2 
gt 		INTEGER1 -gt INTEGER2		INTEGER1 больше INTEGER2 
le 		INTEGER1 -le INTEGER2		INTEGER1 меньше или эквивалентно INTEGER2 
lt 		INTEGER1 -lt INTEGER2		INTEGER1 меньше INTEGER2 
ne 		INTEGER1 -ne INTEGER2	 	INTEGER1 не эквивалентно INTEGER2 
-z		-z STRING					Правда если длинна STRING равна 0
-n		-n STRING					Правда если длинна STRING не 0
==		STRING1 == STRING2			Правда если STRING1 идентично STRING2
!=		STRING1 != STRING2			Правда если STRING1 не идентично STRING2
<	   STRING1 < STRING2		      Правда если STRING1 лексически отсортировано перед STRING2
>	   STRING1 > STRING2		      Правда если STRING1 лексически отсортировано после STRING2

Часть 1: скрипт Hellow World
Часть 2: Переменные
Часть 3: Специальные параметры
Часть 4: Одинарные и двойные кавычки. Математические операции
Часть 5: Структурные конструкции и команда test
Часть 6: Структура If…then…else
Часть 7: Подмножества и части строк. Размеры

Bash учебное пособие. Часть 4: Одинарные и двойные кавычки. Математические операции

Если кавычки ограничивают строку, то все спецсимволы внутри не будут интерпретированы:

ps ax|grep -t unix

результат будет :

grep: invalid option — t
Usage: grep [OPTION]… PATTERN [FILE]…
Try `grep —help’ for more information.

Continue reading

Bash учебное пособие. Часть 3: Специальные параметры

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

$1 — $9 — Это так называемые позиционные параметры, служат для передачи аргументов командной строки.
Если аргументов больше 9, то они должны заключаться в фигурные скобки{}
$0 — Имя скрипта который был запущен.
$# — Количество аргументов командной строки или позиционных параметров
$? — Код с которым была завершена предыдущая команда. Если команда была выполнена удачно,
то значение этой переменной будет 0, если же неудачно то не 0.
$$ — Номер процесса под которым исполняется данный скрипт, очень удобно использовать
в имени файла что бы сделать его уникальным.
$! — Номер последнего, запущенного в фоне процесса.
$- Список флагов переданных сценарию. Годиться разве что для проверки интерактивного режима.
$* — Данный параметр содержит в себе все параметры переданные из командной строки.
$@ — То же самое что $*, только каждый параметр представлен отдельно.
$_ — Специальная переменная, содержит последний аргумент предыдущей команды.

Continue reading

Bash учебное пособие. Часть 2: Переменные

Для того, что бы объявить переменную в bash, сперва необходимо выбрать имя этой переменной. Имя переменной регистрозависемо. Лучше всего в имени переменной использовать верхний регистр букв. Конечно же вы свободны использовать любые буквы или цифры, главное, что бы имя не начиналось с цифры. Необходимо всегда помнить о различиях между именем переменной и ее значением. Если variable1 — это имя переменной, то $variable1 — это ссылка на ее значение. «Чистые» имена переменных, без префикса $, могут использоваться только при объявлении переменный, при присваивании переменной некоторого значения, при удалении (сбросе), при экспорте и в особых случаях — когда переменная представляет собой название сигнала. Давайте переделаем наш скрипт «Hellow World» так что бы в нем появилась переменная:

Continue reading

Bash учебное пособие. Часть 1: скрипт Hello World

Это учебное пособие, в первую очередь предназначено для начинающих, хотя конечно же его могут использовать опытные администраторы в качестве справочника. Очень часто, «зеленые» администраторы недооценивают преимущества скриптового языка bash и стараются держаться от него в стороне. На самом деле, bash, очень простой и многофункциональный скриптовый язык, в котором вы уже работаете но еще не используете всех преимущест. Данное учебное пособия я буду писать постепенно, по главам, описывая основные моменты bash скриптинга.

Из Википедии: bash усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.

Часть 1: скрипт Hello World

И начнем мы, с самого простого, с «Hello world» скрипта. Первое, что мы сделаем, это узнаем, где находиться интерпретатор bash:

where bash

Откройте ваш любимый текстовый редактор и создайте файл hello_world.sh.

Важно: Любой баш скрипт должен начинаться с shebang — #! Так же в первой строке должен находиться полный путь к интерпретатору bash, в моем случаи это /bin/bash

Вернемся к нашему скрипту, вставьте в него следующий текст:

#!/bin/bash
echo "Hello World"

Устанавливаем права на исполнение:

chmod +x hello_world.sh

и запускаем скрипт:

./hello_world.sh

После запуска вы увидите :

Hello World

То есть, команда «echo» используется для вывода данных на экран (stdout)

Так же в скриптах вы можете использовать любые другие программы установленные в вашей системе, запуская их с нужными вам параметрами. Как пример, давайте сделаем скрипт резервного копирования папки /etc:

#!/bin/bash
tar -czf etc_backup.tar.gz /etc

Часть 1: скрипт Hello World
Часть 2: Переменные

Часть 3: Специальные параметры
Часть 4: Одинарные и двойные кавычки. Математические операции
Часть 5: Структурные конструкции и команда test
Часть 6: Структура If…then…else
Часть 7: Подмножества и части строк. Размеры