В лекции рассматриваются следующие вопросы:
Подстановка команд заключается в замене имени команды на результат ее выполнения, т.е. можно результат выполнения одной команды подставить в параметр другой команды.
Формы подстановки: `команда` или $(команда)
Примеры:
cat ` find . –size +4k –type f ` - просмотр содержимого файлов текущего каталога размером > 4 кбайт
cp $(grep 3 * 2> error| cut –f1 –d:) DIR 2>/dev/null – копирование файлов, в тексте которых есть 3, в папку DIR с исключением вывода потока ошибок.
MYFILES=` ls /etc | grep ^pa `; echo $MYFILES – запись в переменную списка имён файлов каталога /etc, имена которых начинаются на pa; вывод значения переменной на экран.
Cкрипт (сценарий) - программа на языке shell (исполняемый файл, содержащий команды).
Создание скрипта (как обычный файл):
Созданный скрипт должен иметь право на исполнение: chmod a+x имя_скрипта
Запуск скрипта:
В скрипте часто используются shell-переменные. Существует несколько способов создания переменных. Переменная - это имя, которому присвоено текстовое значение. Некоторые переменные являются позиционными параметрами - их значения устанавливаются только в командной строке. Остальные переменные - это просто имена, которым пользователь или сам интерпретатор присвоил текстовые значения.
Чтобы присвоить переменной значение, необходимо выполнить следующее действие: var=2 или var=”text”. Для вывода значения переменной используют команду echo, причём обращение к значению происходит через $: echo $var. В скрипте значение переменной можно задать с клавиатуры после запуска скрипта, используя команду read: read var. Для того чтобы переменная содержала результат выполнения команды, необходимо выполнить подстановку: var=`who`, аналогично var=$(who). [1]
Позиционные параметры – это аргументы командой строки (или функции в скрипте), доступ к которым осуществляется по номеру. Обозначаются $0, $1, $2, $3..., где $0 - это название файла сценария, $1 - это первый аргумент, $2 - второй, $3 - третий и т.д. При запуске скрипта задаются по порядку значения позиционным параметрам, переданным в скрипте. Например, в скрипте script указано cat $1; ls $2. Тогда при запуске записываем sh script file DIR, где file – значение для $1, а DIR – для $2. [2]
Командный интерпретатор позволяет, при необходимости, запрашивать у пользователя информацию, которая помещается в указанную переменную. Для этого используется команда read. На практике имеет смысл перед запросом выдать приглашение с помощью команды echo.
Пример:
echo “задай значение” #приглашение на ввод read x #ввести с клавиатуры значение переменной х Hello, world! #вводим значение переменной х echo $х # вывести значение переменной на экран Hello, world!
Командная оболочка позволяет выполнять арифметические операции:
При этом используются следующие команды:
1) Условный оператор "if"
Оператор "if" имеет структуру
if [ условие ] then список (elif условие then список) else список fi
Условия записываются в форме ключей:
-gt (>), -lt (<), -le (<=), -ge (>=), -eq (=), -ne (не равно) (для сравнения числовых значений).
Пример:
if [ $1 –ne $2 ] then cat a1 else echo a1 fi
Проверка условий (для файлов):
|
[ -d FILE ] |
FILE директорией. |
|
[ -e FILE ] |
FILE существует. |
|
[ -f FILE ] |
FILE является обычным файлом. |
|
[ -h (-L) FILE ] |
FILE является символической ссылкой. |
|
[ -p FILE ] |
FILE является именованным каналом (FIFO). |
|
[ -r FILE ] |
FILE доступен для чтения. |
|
[ -s FILE ] |
размер FILE больше нуля. |
|
[ -w FILE ] |
FILE доступен для записи. |
|
[ -x FILE ] |
FILE является исполняемым. |
|
[ -O FILE ] |
владелец FILE - действующий пользователь. |
Проверка условий (для строк):
|
[ -z "STRING" ] |
длина строки "STRING" равна нулю. |
|
[ -n "STRING" ] |
длина строки "STRING" ненулевая. |
|
[ STRING1 = STRING2 ] |
строки равны. |
|
[ STRING1 != STRING2 ] |
строки не равны. |
Пример 1:
echo "Тell me a word" read a if [ "$a" = "yes" ] then head -1 $1 else echo "You didn’t guess" fi
Пример 2:
if [ -d $1 ] then du -sh $1 else echo "$1 is file with $(wc –l $1 | cut –f1 –d” ”) str." fi
Пример 3:
a=`find . -empty -type f` if [ $? -eq 0 ] then echo "$a\n" # \n - перевод строки fi
2) Оператор выбора "case".
Оператор выбора "case" имеет структуру:
case переменная in шаблон) список команд;; шаблон) список команд;; ... esac
Пример:
case $1 in 1) sort a1;; 2) sort –r a1;; *) cat a1;; esac
При запуске sh script 1 выполняется сортировка а1, при - sh script 2 - сортировка а1 в обратном порядке, при - sh script 3 – вывод содержимого а1.
3) Оператор цикла с перечислением "for" имеет структуру:
for переменная in список значений do список команд done
Пример 1:
for i in * do cat $i done -вывести все файлы текущего каталога
Пример 2:
for f in $(ls /var); do echo $f done
4) Оператор цикла с истинным условием.
Оператор цикла "while" имеет структуру:
while [ условие ] do список команд done
- Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия.
- При первом входе в цикл условие должно выполняться.
- Начальное истинное значение задаётся перед циклом.
5) Оператор цикла с ложным условием.
Оператор цикла "until" имеет структуру:
until [ условие ] do список команд done
Пример 1:
x=0 while [ $x –lt 5 ] do cat a1 x=`expr $x + 1` done
# Выводится содержимое файла а1 на экран 5 раз.
Пример 2:
x="ok" until [ "$x" = "not ok" ] do cat a1 echo "show again? " read x don
# Пока x не равен ok, на экране – содержимое а1. Значение х задаётся с клавиатуры.
6) Функция в shell.
Функция позволяет подготовить список команд для последующего выполнения.
Описание функции имеет вид:
имя()
{
список команд
}
имя
- Функция используется для выполнения действия рекурсивно.
Пример 1:
fn()
{
for i in *
do
if [ -d $i ]
then
cd $i; fn; cd ..
else
grep 3 $i && echo $i
fi
done
}
fn
# Рекурсивный поиск (в каталоге и подкаталогах) файлов, содержащих строки с цифрой 3.
Пример 2 (позиционная переменная в функции):
factorial()
{
i=1; n=1
while [ $i -le $1 ]
do
n=`expr $n \* $i`
i=`expr $i + 1`
done
echo $n
}
factoriall $1
- вычисление факториала.
При запуске скрипта необходимо указать значение для $1.
Источники:
1. StudFiles. Переменные Shell. – URL: https://studfiles.net/preview/4631958/page:12/
2. RTFM: Linux, DevOps и системное администрирование. BASH: позиционные и специальные параметры. - URL: https://rtfm.co.ua/bash-pozicionnye-i-specialnye-parametry/