9.1. Подстановка команд

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

Формы подстановки: `команда` или $(команда)

Примеры:

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; вывод значения переменной на экран.

9.2. Создание сценариев

Cкрипт (сценарий) - программа на языке shell (исполняемый файл, содержащий команды).

Создание скрипта (как обычный файл):

  1. cat > имя_скрипта
  2. vi имя_скрипта (или nano)

Созданный скрипт должен иметь право на исполнение: chmod a+x имя_скрипта

Запуск скрипта:

  1. sh имя_скрипта
  2. ./имя_скрипта
  3. bash имя_скрипта

В скрипте часто используются 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!

					

9.3. Вычисления в Shell

Командная оболочка позволяет выполнять арифметические операции:

  • a +(-) b – сложение (вычитание);
  • a * b – умножение (a \* b ) – для expr;
  • a / b – деление;
  • a % b – остаток от деления;
  • a ** b – возведение в степень (a ^ b – для bc);
  • sqrt (a) – квадратный корень.

При этом используются следующие команды:

  1. echo $((a+b)); c=$(($x * $y)).
  2. echo "sqrt(16)" | bc; c=$(echo "2+2" | bc); echo 'scale=4; sqrt(9^3)' | bc # scale – точность.
  3. expr 15 + 25; с=`expr $x \* $y + 34 / 2`.
  4. let "c = a % b“.

9.4. Структурные операторы Shell

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/