В данной статье я вкратце опишу 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. Операции: * - умножение / - деление + - сложение - - вычитание % - деление с остатком Синтаксис: let <значение> <оператор> <значение> Пример: #!/bin/sh let res=2*7 echo $res >--------------------------------------< 14 >--------------------------------------< Оператор test или []. Данные операторы предназначены для выполнения сравнений двух значений. Если сравнение успешно-оператор возвращает 0,иначе 1.Код завершения последней выполненной команды хранится в специальной переменной $?. Синтаксис: 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 Пример: #!/bin/sh if [ $1 -eq 10 ]; then echo var=10 fi Результат работы,при переданном параметре равном 10: >--------------------------------------< var=10 >--------------------------------------< 2)if <команда> then <команда> else <команда> fi Пример: #!/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 Пример: #!/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 Выполняет команды пока условие истино. Пример: #!/bin/sh cont=yes while [ $cont = yes ] do echo -n "continue?" read cont done >--------------------------------------< continue? yes continue? no >--------------------------------------< 2)until <условие> do <команды> done Выполняет команды пока условие ложно. Пример: #!/bin/sh cont=yes until [ $cont = no ] do echo -n "continue?" read cont done >--------------------------------------< continue? yes continue? no >--------------------------------------< 3)for <переменная> do <команды> done Выполняет команды для каждого параметра,который был передан сценарию в командной строке. Пример: #!/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 #? _ >--------------------------------------< « Предыдущая ИНДЕКС Исправить src / Печать Следующая » Обсуждение [ Линейный режим | Показать все | RSS ] 1.1, andrey, 13:57, 26/10/2007 [ответить] [смотреть все] +/– > сравнение строк > ... > = равенство ошибка 1.2, root, 18:57, 26/10/2007 [ответить] [смотреть все] +/– #!/bin/sh let res=2*7 echo $res ошибка - оно будет выводить дважды ответ "14" 1.3, root, 18:59, 26/10/2007 [ответить] [смотреть все] +/– #!/bin/sh echo 'My name is Vasya" выведет что не найдена закрывающая кавычка. 1.4, root, 19:00, 26/10/2007 [ответить] [смотреть все] +/– Опять пишем банальные истины?:( 1.6, naquad, 03:46, 07/11/2007 [ответить] [смотреть все] +/– бож.... ну что теперь каждый считает своим долгом отписать какую-то статью на мега затёрто-банальную тему? :( 1.7, andrew, 14:38, 17/12/2007 [ответить] [смотреть все] +/– select во фрибсд по крайней мере нету в /bin/sh 1.8, shellunit, 16:53, 18/12/2007 [ответить] [смотреть все] +/– Кому то это статья очень сильно поможет ))). Начинающему кодеру в самый раз. Так держать. 1.9, Hyston, 00:14, 01/02/2008 [ответить] [смотреть все] +/– Чайник сел за линукс, статья помогает, один вопрос: Это всё куда вбивать?? В текстовый файл? В винде это называлось батниками, блин.. 2.11, vladd, 20:32, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/– В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку] 2.12, vladd, 20:34, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/– В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку] 2.13, vladd, 20:37, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/– В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку] 1.10, vladd, 20:17, 15/02/2008 [ответить] [смотреть все] +/– Статья нужная. 1.14, Kazm, 11:44, 08/03/2008 [ответить] [смотреть все] +/– Как выйти из цикла for? не выходя из скрипта? exit выводит из скрипта полностью... 2.15, naquad, 11:48, 08/03/2008 [^] [ответить] [смотреть все] [показать ветку] +/– break - убивает _последний_ цикл т е for x in do for i in do ... весь текст скрыт [показать] [показать ветку] 3.16, naquad, 11:53, 08/03/2008 [^] [ответить] [смотреть все] +/– »Как выйти из цикла for? не выходя из скрипта? »exit выводит из скрипта полностью... ещё маленькое дополнение: у них есть параметр уровень (он опциональный), им можно рулить какой цикл остановить или перейти на след. итерацию: for x in ... do for i in ... do # остановит for x in ... [ "$i" = "123" ]&&break 1 done done script.sh
Shell
:سرگئی راسپوتین
1
В данной статье я вкратце опишу 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.
Операции:
* - умножение
/ - деление
+ - сложение
- - вычитание
% - деление с остатком
Синтаксис:
let <значение> <оператор> <значение>
Пример:
#!/bin/sh
let res=2*7
echo $res
>--------------------------------------<
14
>--------------------------------------<
Оператор test или [].
Данные операторы предназначены для выполнения сравнений двух значений.
Если сравнение успешно-оператор возвращает 0,иначе 1.Код завершения
последней выполненной команды хранится в специальной переменной $?.
Синтаксис:
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
Пример:
#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
fi
Результат работы,при переданном параметре равном 10:
>--------------------------------------<
var=10
>--------------------------------------<
2)if <команда> then
<команда>
else
<команда>
fi
Пример:
#!/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
Пример:
#!/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
Выполняет команды пока условие истино.
Пример:
#!/bin/sh
cont=yes
while [ $cont = yes ]
do
echo -n "continue?"
read cont
done
>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<
2)until <условие>
do
<команды>
done
Выполняет команды пока условие ложно.
Пример:
#!/bin/sh
cont=yes
until [ $cont = no ]
do
echo -n "continue?"
read cont
done
>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<
3)for <переменная>
do
<команды>
done
Выполняет команды для каждого параметра,который был передан
сценарию в командной строке.
Пример:
#!/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
#? _
>--------------------------------------<
« Предыдущая ИНДЕКС Исправить src / Печать Следующая »
Обсуждение [ Линейный режим | Показать все | RSS ]
1.1, andrey, 13:57, 26/10/2007 [ответить] [смотреть все]
+/–
> сравнение строк
> ...
> = равенство
ошибка
1.2, root, 18:57, 26/10/2007 [ответить] [смотреть все]
+/–
#!/bin/sh
let res=2*7
echo $res
ошибка - оно будет выводить дважды ответ "14"
1.3, root, 18:59, 26/10/2007 [ответить] [смотреть все]
+/–
#!/bin/sh
echo 'My name is Vasya"
выведет что не найдена закрывающая кавычка.
1.4, root, 19:00, 26/10/2007 [ответить] [смотреть все]
+/–
Опять пишем банальные истины?:(
1.6, naquad, 03:46, 07/11/2007 [ответить] [смотреть все]
+/–
бож.... ну что теперь каждый считает своим долгом отписать какую-то статью на мега затёрто-банальную тему? :(
1.7, andrew, 14:38, 17/12/2007 [ответить] [смотреть все]
+/–
select во фрибсд по крайней мере нету в /bin/sh
1.8, shellunit, 16:53, 18/12/2007 [ответить] [смотреть все]
+/–
Кому то это статья очень сильно поможет ))).
Начинающему кодеру в самый раз. Так держать.
1.9, Hyston, 00:14, 01/02/2008 [ответить] [смотреть все]
+/–
Чайник сел за линукс, статья помогает, один вопрос: Это всё куда вбивать?? В текстовый файл? В винде это называлось батниками, блин..
2.11, vladd, 20:32, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/–
В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку]
2.12, vladd, 20:34, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/–
В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку]
2.13, vladd, 20:37, 15/02/2008 [^] [ответить] [смотреть все] [показать ветку] +/–
В любой своей директории набери touch test chmod 755 test Впиши или скопиру... весь текст скрыт [показать] [показать ветку]
1.10, vladd, 20:17, 15/02/2008 [ответить] [смотреть все]
+/–
Статья нужная.
1.14, Kazm, 11:44, 08/03/2008 [ответить] [смотреть все]
+/–
Как выйти из цикла for? не выходя из скрипта?
exit выводит из скрипта полностью...
2.15, naquad, 11:48, 08/03/2008 [^] [ответить] [смотреть все] [показать ветку] +/–
break - убивает _последний_ цикл т е for x in do for i in do ... весь текст скрыт [показать] [показать ветку]
3.16, naquad, 11:53, 08/03/2008 [^] [ответить] [смотреть все]
+/–
»Как выйти из цикла for? не выходя из скрипта?
»exit выводит из скрипта полностью...
ещё маленькое дополнение: у них есть параметр уровень (он опциональный), им можно рулить
какой цикл остановить или перейти на след. итерацию:
for x in ...
do
for i in ...
do
# остановит for x in ...
[ "$i" = "123" ]&&break 1
done
done script.sh