10 секундное руководство по Bash Shell Scripting
14.05.2008Прежде всего позвольте мне уточнить, что это не будет детальное изучение скриптов оболочки, это будет быстрое руководство по на синтаксису, используемого в скриптах bash. Итак, если вы ждете другого, то тогда вы должны купить себе хорошую книгу по написанию сценариев. ;-) Итак, давайте перейдем к руководству.
-- Начала 10 секундного руководства по Bash Shell Scripting --
Общие переменные окружения
PATH - Устанавливает путь поиска для любой исполняемый командой. Аналогично переменной PATH в MSDOS.
HOME - домашний каталог пользователя.
MAIL - Содержит путь к месту хранения почты пользователя.
IFS - Содержит строку символов, которые используются как разделители в командной строке. Строка, как правило, состоит из пробела, табуляции и символы новой строки. Чтобы увидеть их придется сделать восьмеричный дамп следующим образом:
$ echo $IFS | od -bcPS1 и PS2 - Основное и вторичное приглашение в bash. PS1 устанавливается $ по умолчанию и PS2 установлен в '>'. Чтобы увидеть вторичное, просто запустите команду:
$ ls |USER - имя пользователя для входа.
TERM - обозначает тип терминала который используется. Должно быть настроены правильно для редакторов типа vi для правильной работы.
SHELL - определяет тип оболочки, которую видит пользователь при входе в систему.
Примечание: Чтобы узнать какие значения имеют проведенные выше переменные окружения, выполните команду echo c именем переменной начинающееся с $. Например:
$ echo $USER ravi... получаем значение хранящееся в переменной USER.
Некоторые bash shell scripting правила
1) В первой строке вашего скрипта должно быть
#!/bin/bash... то есть сначала #, затем !, затем путь до оболочки. Эта линия позволяет узнать расположение файла оболочки.
2) Перед выполнением скрипта, вы должны сделать скрипт исполняемым. Делается это следующей командой:
$ chmod ugo+x your_shell_script.sh3) Обычно скрипт имеет расширение .sh. Это позволяет пользователю понять, что файл является скриптом.
Условные выражения
Выражение 'if':
if condition_is_true
then
execute commands
else
execute commands
fiif condition_is_true
then
execute commands
elif another_condition_is_true
then
execute commands
else
execute commands
fiif grep "linuxhelp" thisfile.html
then
echo "Found the word in the file"
else
echo "Sorry no luck!"
fiОператоры сравнения
-eq  Равно
-le  Меньше или равно-f file   True если file существует и является обычным файлом
-r file True если file существует и доступен для чтения
-w file True если file существует и доступен на запись
-x file  True если file существует и является исполняемым
-d file True если file существует и является каталогом
-s file True если файл существует и имеет размер больше 
чем ноль.-n str True, если строка str не равна null
-z str True, если строка str равна null
str1 == str2 True если обе строки равны
str1 != str2 True если строки не равны
str True, если строке str присвоено значение и не равно null-a Аналогично AND
-o Аналогично ORtest $d -eq 25 && echo $dtest $s -lt 50 && do_somethingif [ $d -eq 25 ]
then
echo $d
fiif [$str1 == $str2 ]
then
    do something
fi
if [ -n "$str1" -a -n "$str2" ]
then
    echo 'Both $str1 and $str2 are not null'
fiВыражение case
Case является вторым условным выражением поддерживаемым оболочкой. Синтаксис:
case expression in
pattern1) execute commands ;;
pattern2) execute commands ;;
...
esacПример:
...
echo "Enter your option : "
read i;
case $i in
   1) ls -l ;;
   2) ps -aux ;;
   3) date ;;
   4) who ;;
   5) exit
esacВот еще один пример:
case `date |cut -d" " -f1` in
   Mon) commands ;;
   Tue) commands ;;
   Wed) commands ;;
   ...
esac...
echo "Do you wish to continue? (y/n)"
read ans
case $ans in
Y|y ;;
[Yy][Ee][Ss]) ;;
N|n) exit ;;
[Nn][Oo]) exit ;;
 *) echo "Invalid command"
esacЦиклы
Цикл while
Синтаксис:
while condition_is_true
do
   execute commands
donewhile [ $num -gt 100 ]
do
    sleep 5
done
while:
do
    execute some commands
doneЦикл until
Цикл выполняется пока выражение не станет ложным. Синтаксис:
until false
do
    execute commands
done...
until [ -r myfile ]
do
sleep 5
doneЦикл for
Синтаксис:
for variable in list
do
execute commands
done...
for x in 1 2 3 4 5
do
    echo "The value of x is $x";
donefor var in $PATH $MAIL $HOME
do
    echo $var
done...
for file in *.java
do
    javac $file
done$* - Это означает, что все параметры передаются в скрипт на момент его исполнения. Что включает в себя $1, $2 и так далее.
$0 - Имя выполняемого скрипта.
$# - Количество аргументов, указанных в командной строке.
$? - Выходной статус последней команды.$ ./my_script.sh linux is arobust OS$* - будет содержать значения 'linux','is','a','robust','OS'.
$0 - будет содержать значение my_script.sh - имя скрипта во время исполнения.
$# - содержит значения 5 - общее количество параметров.
$$ - содержит ID процесса текущей оболочки. Вы можете использовать этот параметр для уникальных имен каких-либо временных файлов, которые вы создаете во время исполнения.
$1 - содержит значения 'linux'
$2 - содержит значение 'is'
... и так далее.
Операторы set и shift
set - позволяет связать значения с позиционными параметрами.
Например, попробуйте следующее:
$ set `date`
$ echo $1
$ echo $*
$ echo $#
$ echo $2Пример:
$ set `date`
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3$ echo $$
2667$ ps -f |grep bashСделайте ваш скрипт интерактивным. read позволит пользователю ввести значения, пока скрипт выполняется. Когда программа ждет ввода, она останавливается. Введенный через клавиатуру id считывается, и выполнение программы продолжается.
Например:
#!/bin/sh
echo "Enter your name : "
read name
echo "Hello $name , Have a nice day."Каждая команда возвращает значения после выполнения. Эта величина называется статус выхода или возвращаемое значение команды. Команда сообщает true, если выполняется успешно, и false, если нет. Это может быть проверено в скрипте, используя $?.
-- Конец 10 секундного руководства по Bash Shell Scripting --
Источник: .
Статьи по теме:
Выбор диапазона IP адресов используя egrep - bash