Shell-программирование. Написание скриптов для Linux-shell
Автор: iNo // k0dsweb gr0up
Статья является собственностью команды KodsWeb (www.kodsweb.ru)
-= 06.09.2006 =-
Intro...
В данной статье я вкратце опишу shell-программирование, рассмотрю простейшие примеры и прокомментирую их. Сразу оговорюсь,что эта статья не является исчерпывающим руководством по shell-программированию. Но её будет достаточно чтобы освоить его основы. Несмотря на кажущуюся простоту shell-программирования, оно является достаточно мощным инструментом администратора unix-системы.Замечу,что для полноценного администрирования unix-системы, уметь программировать на shell просто необходимо. Все примеры протестированы на системе Slackware Linux 10.2 и полностью работоспособны.
Общие положения.
Комментарии начинаются с символа #, за исключением первой строки. Первой строкой сценария является путь к интерпретатору, начинающийся с #! с помошью которого будет запущен данный скрипт. Например:
#!/bin/sh
#А вот это уже комментарий
Переменные, ввод и вывод данных.
Для задания переменных используется оператор присваевания "=". Синтаксис следующий:
<переменная>=<значение>
Замечу,что в отличие от языков perl и php,между знаком "=" и остальными параметрами нельзя ставить пробел.В этом случае интерпретатор выдаст ошибку.Чтобы обратится к заданной переменной ,надо вызвать её поставив перед ней знак $.Удалить переменную можно с помощью оператора unset. Оператор Echo просто выводит строку(или переменную), идущую после него:
#!/bin/sh
var=Vasya
echo $var
>--------------------------------------<
Vasya
>--------------------------------------<
#!/bin/sh
echo My name is Vasya
>--------------------------------------<
My name is Vasya
>--------------------------------------<
В данный пример также можно добавить одинарные или двойные кавычки, от этого результат работы программы не изменится. Но не стоит использовать обратные кавычки, т.к.эти символы используются для выполнения команд:
#!/bin/sh
echo `My name is Vasya"
>--------------------------------------<
Error: My: command not found
>--------------------------------------<
#!/bin/sh
echo 'ls -a'
>--------------------------------------<
. .. .bash_history script.sh
>--------------------------------------<
Оператор read присваевает значение переменной.Вот пример,который просит ввести переменную var,считывает её а затем выводит.
#!/bin/sh
echo "Input var:"
read var
echo "The var is $var"
>--------------------------------------<
Input var:
123
The var is 123
>--------------------------------------<
Агрументы командной строки.
Как и во всех консольных программах, в shell-сценарий можно передавать аргументы из командной строки.Переменные $1..$9 соответствуют параметрам, переданным из командной строки сценарию.Переменная $0 содержит имя интерпретируемого файла.$#-содержит количество переданных аргументов. $* и $@ содержат все аргументы,но в $@ все аргументы выделены кавычками. Напишем скрипт,который выводит 2 аргумента командной строки и имя исполняемого файла.Запуск скрипта: ./script.sh 1 2
#!/bin/sh
echo "Name:$0"
echo "First argument:$1"
echo "Second argument:$2"
>--------------------------------------<
Name:./script.sh
First argument:1
Second argument:2
>--------------------------------------<
Арифметические операции.
Арифметические операции производятся с использованием оператора let. Операции:
* - умножение / - деление + - сложение - - вычитание % - деление с остатком
Синтаксис арифметических операций в Shell:
let <значение> <оператор> <значение>
Пример sh let:
#!/bin/sh
let res=2*7
echo $res
>--------------------------------------<
14
>--------------------------------------<
Оператор test или [].
Данные операторы предназначены для выполнения сравнений двух значений. Если сравнение успешно-оператор возвращает 0,иначе 1.Код завершения последней выполненной команды хранится в специальной переменной $?.
Синтаксис оператора test:
test <значение> -опция <значение>
или
[<значение> -опция <значение>]
Пример:
#!/bin/sh
var=10
[ $var -eq 8 ]
echo $?
>--------------------------------------<
1
>--------------------------------------<
Ниже приведены все опции оператора test(или []):
Сравнение целых чисел:
-gt больше чем -lt меньше чем -ge больше чем либо равно -le меньше чем либо равно -eq равно -ne не равно
Сравнение строк:
-z проверка на наличие пустой строки -n проверка на наличие строки-значения = равенство != неравенство str проверка на наличие строки,состоящей из нулей
Логические операции:
-a И -o ИЛИ ! НЕ
Проверка файлов:
-f установка факта существования файла и его регулярности -s проверка,не является-ли файл пустым -r проверка возможности считывания файла -w проверка возможности записи файла -x проверка исполняемости файла -d проверка,является-ли файл каталогом -h проверка,является-ли файл ссылкой -c проверка,является-ли файл байт-ориентированным устройством -d проверка,является-ли файл блок-ориентированным устройством
Условия.
Ниже описан синтаксис всех условных операторов, с примерами.
1) if <команда> then <команда> fi
Пример условия if ... then:
#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
fi
Результат работы,при переданном параметре равном 10:
>--------------------------------------<
var=10
>--------------------------------------<
2) if <команда> then <команда> else <команда> fi
Пример if ... then ... else:
#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
else
echo var!=10
fi
Результат работы,при переданном параметре равном 10:
>--------------------------------------<
var=10
>--------------------------------------<
Результат работы,при переданном параметре равном 7:
>--------------------------------------<
var!=10
>--------------------------------------<
3) if <команда> then <команда> elif <команда> else <команда> fi
Пример if ... then ... elif ... else:
#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
elif [ $1 -eq 9 ]; then
echo var=9
else
echo var!=10 and var!=9
fi
Результат работы,при переданном параметре равном 10:
>--------------------------------------<
var=10
>--------------------------------------<
Результат работы,при переданном параметре равном 9:
>--------------------------------------<
var=9
>--------------------------------------<
Результат работы,при переданном параметре равном 8:
>--------------------------------------<
var!=10 and var!=9
>--------------------------------------<
4) case <строка> in <шаблон>) <команды> ;; *) <команды> ;; esac
Case-конструкция позволяет выбирать один из нескольких альтернативных вариантов.
#!/bin/sh
case $1 in
1)
echo arg is 1
;;
2)
echo arg is 2
;;
*)
echo arg is other
;;
esac
Результат работы,при переданном параметре равном 1:
>--------------------------------------<
arg is 1
>--------------------------------------<
Результат работы,при переданном параметре равном 2:
>--------------------------------------<
arg is 2
>--------------------------------------<
Результат работы,при переданном параметре равном 10:
>--------------------------------------<
arg is other
>--------------------------------------<
Циклы.
1) while <условие> do <команды> done
Оператор языка shell-программирования while выполняет команды, пока условие истино.
Пример:
#!/bin/sh
cont=yes
while [ $cont = yes ]
do
echo -n "continue?"
read cont
done
>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<
2) until <условие> do <команды> done
Оператор until выполняет команды, пока условие ложно.
Пример:
#!/bin/sh
cont=yes
until [ $cont = no ]
do
echo -n "continue?"
read cont
done
>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<
3) for <переменная> do <команды> done
Цикл for - выполняет команды для каждого параметра, который был передан сценарию в командной строке.
Пример:
#!/bin/sh
for var
do
echo $var
done
Результат работы программы,с параметрами 1 2 3 4 5:
>--------------------------------------<
1
2
3
4
5
>--------------------------------------<
4) for <переменная> in <строка>
do
<команды>
done
Эта конструкция отличается от обычного for тем, что параметры берутся не из командной строки, а из строки после оператора in.
5) select <строка> in <перечень элементов>
do
<команды>
done
Конструкция select создаёт меню на основе элементов заданного списка, а затем выполняет для него указанную команду.
Пример:
#!/bin/sh
select var in 1 2 3
do
case $var in
1)
echo Number 1
;;
2)
echo Number 2
;;
3)
echo Number 3
;;
*)
echo Other
;;
esac
done
>--------------------------------------<
1) 1
2) 2
3) 3
#? 3
Number 3
#? _
>--------------------------------------<
Оригинал статьи http://www.opennet.ru/base/dev/shell_coding.txt.html