Параметры командного файла

При запуске командного файла, можно передать разные значения (параметры) после имени файла. Эти параметры используются в качестве переменных в командах, что позволяет создавать командные файлы общего назначения, и использовать их с разными параметрами, в зависимости от поставленной задачи. В командном файле соответствующие параметрам переменные (аналогично shell-переменным) обозначаются символом "$", а далее следует одна из цифр от 0 до 9. $0 - соответствует имени данного командного файла; $1 - первый по порядку параметр; $2 - второй параметр и т.д.

Пусть в командном файле с именем " hello " записаны следующие команды:

#! /bin/sh

echo выполнение командного файла $0:

echo «Как Вас зовут? Завершение: ctrl+d»

cat >> $1

cat $1

cat $2

а файлы "file1" и "file2" содержат соответственно следующие строки

file1: Дорогой

file2: Поздравляем Вас с успешной работой в ОС LINUX!!

Создайте файлы hello, file1, file2.

Выполните команду: hello file1 file2.

Задание: Напишите командный файл, который будет выполнять поиск файла, имя которого передается через параметр, по всей файловой системе.

Переделайте этот файл так, чтобы имя файла и каталог для поиска запрашивались у пользователя (используйте команду read).

Оператор цикла for

for <переменная> in <список значений>

do

<список команд>

Done

Ключевые слова for, do, done пишутся с начала строки.

Пусть имеется три файла: gr1, gr2, gr3, в каждом из которых хранится список студентов данной группы в не отсортированном виде. Нужно создать сводный список студентов по группам в файле studlist.

Следующий командный файл обращается по порядку к каждому из файлов gr1, gr2, gr3, сортирует список соответствующей группы, хранящийся в файле, и добавляет в файл studlist.

Командный файл addlist:

#! /bin/sh

echo "списки групп:" | cat > studlist (в файл studlist записываем строку-заголовок)

for f in gr* (или for f in gr1 gr2 gr3) (переменная f последовательно принимает значения gr1, gr2, gr3)

do

echo "группа $f" | cat>> studlist

sort $f | cat>> studlist

done

Создайте файлы gr1, gr2, gr3, в каждый из которых поместите список из 3-4 фамилий (не в алфавитном порядке). Создайте командный файл addlist, выполните его. Просмотрите полученный файл studlist.

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

Командный файл make3dir:

#! /bin/sh

cd ~

for i in $1 $2 $3

do

mkdir $i

cd $i

done

Допустим, что командный файл был запущен следующей командой: make3dir d1 d2 d3, т.е. значение первого параметра $1 - d1, второго параметра $2 - d2, третьего параметра $3 - d3. Переменная i сначала принимает значение первого параметра $1, т.е. i=d1. Поэтому в текущем каталоге создается каталог, имя которого совпадает с i, т.е. каталог d1. Затем этот каталог становится текущим. Далее i принимает значение d2, создается каталог d2 в текущем каталоге (в d1), созданный каталог d2 становится текущим. Далее все повторяется для i=d3.

Создайте командный файл make3dir. Запустите его с параметрами d1 d2 d3. Проверьте создались ли вложенные каталоги (d1 - d2 - d3) в вашем домашнем каталоге?

Задание: Создайте командный файл, который в каталоге d1 создавал бы 2 текстовых файла, имена которых пользователь вводил бы через параметры команды.

Создайте командный файл make3file, который создавал бы в каждом из каталогов d1, d2, d3 текстовые файлы соответственно text1, text2, text3. Имена файлов передаются через параметры командного файла.

Часто используется форма " for i in * ", означающая - для всех файлов текущего каталога. Рассмотрим пример:

Командный файл renall:

#! /bin/sh

echo Укажите полное имя каталога

read k

cd $k

for i in *

do

mv $i stud$i (переименовать все файлы и каталоги в текущем каталоге - добавить stud в начало каждого имени).

done

В этом примере используется команда read для ввода значения переменной k пользователем с клавиатуры. Текущим становится каталог, имя которого было введено пользователем и записано в переменную k. Переменная i последовательно пробегает все файлы и каталоги текущего каталога, т.е. значения переменной iпоследовательно соответствуют именам файлов или каталогов, расположенного в каталоге, имя которого передается с помощью параметра (cd $1 - делает текущим указанный каталог).

Создайте командный файл renall, запустите его с параметром d1.

Задание: Напишите командный файл, который будет осуществлять поиск слова, введенного пользователем, во всех файлах текущего каталога. Для поиска используйте команду grep (см. help по этой команде).

Команда test [ ]

Команда test проверяет выполнение некоторого условия. С использованием этой (встроенной) команды формируются операторы выбора и цикла языка shell.

Есть два возможных формата команды:

Test условие

Или

[ условие ]

Мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово test, будем заключать условие в скобки. Между скобками и содержащимся в них условием обязательно должны быть пробелы.

Условия проверки файлов:

-f имя - файл имя является обычным (регулярным)файлом;

-d имя - файл имя - каталог;

-L имя - файл имя - символьная ссылка;

-r имя - имеется разрешение на чтение файла имя;

-w имя - имеется разрешение на запись в файл имя;

- x имя - имеет разрешение на выполнение файла имя;

-s имя - файл имя не пустой.

Условия проверки строк:

str1 = str2 - строки "str1" и "str2" совпадают;

str1!= str2 - строки "str1" и "str2" не совпадают;

-n str1 - строка "str1" существует (непустая);

-z str1 - строка "str1" не существует (пустая, имеет нулевую длину).

Условия сравнения целых чисел:

x -eq y - x = y,

x -ne y - x не равно y,

x -gt y - x > y,

x -ge y - x >= y,

x -lt y - x < y,

x -le y - x <= y.

Объединение и отрицание при проверке:

t1 -a t2 -логическое И

t1 -o t2 -логическое ИЛИ

! t1 -отрицание

Условный оператор if

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

Простейшая форма - if then:

If условие

Then

Список команд

fi

В общем случае оператор if имеет структуру:

If условие

Then

Список команд 1

Elif условие

Then список команд 2

Elif...

...

Else

Список команд N

fi

elif сокращенный вариант от else if.

Если выполняется условие, т.е. условие истинно, то выполняется список команд, иначе он пропускается. Обратите внимание, что структура обязательно завершается служебным словом fi.

Создадим командный файл del, который будет удалять файл или каталог, имя которого вводится через параметр.

Командный файл del:

#! /bin/sh

if [ -d $1 ] (проверяем: значение параметра является каталогом?)

then

echo "Это каталог. Удалить с файлами (Y)/ Не удалять (N)"

read a

if [ $a = "y" ]

then

rm -r - f $1 (-f удаляет файлы без предупреждения)

fi

else

echo "Это файл. Удалить (Y)/ Не удалять (N)"

read a

if [ $a = "y" ]

then

rm $1

fi

fi

В данном командном файле сначала идет проверка, является ли введенное через параметр имя, каталогом. Если да, то пользователь решает удалять или не удалять этот каталог. Введенное пользователем значение записывается в переменную а, затем осуществляется проверка, если значение а = «у», то производится удаление каталога.

В противном случае (если введено имя файла) пользователь получает уведомление о том, что это файл, и сообщает удалять его или нет. Если значение а = «у», то производится удаление файла.

Создадим командный файл, который выдает на экран справку о числе файлов, созданных указанным пользователем (через параметр). Предусмотреть возможность удаления этих файлов после выдачи сообщения пользователю.

Командный файлdelusrfile:

#! /bin/sh

find /home -type f -user $1 > ~/findlist (поиск файлов, созданных указанным пользователем, запись списка файлов в findlist)

echo количество файлов, созданных пользователем $1:

wc -l ~/findlist (подсчет кол-ва строк в файле findlist)

echo удалить эти файлы? (y - да, n - нет)

read a

if [ $a = "y" ]

then

cat ~/findlist | xargs -e rm

fi

(считываются строки из findlist и передаются команде xargs, назначение которой строить и выполнять команду, поступившую на вход. Ключ -е позволяет считывать не весь файл целиком, а построчно. Таким образом, строка, содержащая полное имя файла, считывается из findlist и передается команде rm, удаляющей этот файл).

Оператор выбора case

Оператор выбора имеет структуру:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: