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
fi
if также позволяет ветвления. То есть вы можете оценить несколько условий, если предыдущие условия отклонены.
if condition_is_true
then
execute commands
elif another_condition_is_true
then
execute commands
else
execute commands
fi
Пример:
if grep "linuxhelp" thisfile.html
then
echo "Found the word in the file"
else
echo "Sorry no luck!"
fi
if дополняется - test
Тест оценит выражение справа, и возвращает либо верно или неверно. Для этого используется следующие операторы:Операторы сравнения
-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 Аналогично OR
Пример:
test $d -eq 25 && echo $d
... что означает, если значение в переменной d равно 25, в выводим значение. Иначе ничего не выведется.
test $s -lt 50 && do_something
if [ $d -eq 25 ]
then
echo $d
fi
В вышеприведенном примере я использовал квадратные скобки, вместо ключевого слова test - это еще один способ сделать то же самое.
if [$str1 == $str2 ]
then
do something
fi
if [ -n "$str1" -a -n "$str2" ]
then
echo 'Both $str1 and $str2 are not null'
fi
... если обе строки не являются равными null затем выполняем команду echo. Несколько вещей, которые нужно помнить при использовании test.
Если вы используете квадратные скобки [], вместо test, то необходимо вставить пробел после [ и перед ].
Примечание: test проверяет только целые значения. Дробные просто усекаются. Не используйте маски для тестирования равенства строки.
Выражение case
Case является вторым условным выражением поддерживаемым оболочкой. Синтаксис:
case expression in
pattern1) execute commands ;;
pattern2) execute commands ;;
...
esac
Ключевыми словами здесь являются case и 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
Case также поддерживает в выражении более чем один шаблон в каждом варианте. Вы также можете использовать wild-cards для сопоставления шаблонов.
...
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
В приведенном случае, если вы введете Yes, YES, yEs и любую их комбинацию, то значение будет найдено.
Циклы
Цикл while
Синтаксис:
while condition_is_true
do
execute commands
done
Пример:
while [ $num -gt 100 ]
do
sleep 5
done
while:
do
execute some commands
done
Выше код реализует бесконечный цикл. Вы также можете написать 'в то время как справедливо' вместо 'а:'.
Здесь я хотел бы ввести два ключевых слова в связи с looping условные. Они перерыв и продолжить.
Перерыв - Это ключевое слово вызывает контроль вырваться из петли. далее - Это ключевое слово будет приостанавливать исполнение всех заявлений после него и выключатели контроль верхней части петли для следующей итерации.Цикл until
Цикл выполняется пока выражение не станет ложным. Синтаксис:
until false
do
execute commands
done
Пример:
...
until [ -r myfile ]
do
sleep 5
done
Вышеуказанный код выполняется повторно до тех пор, пока файл myfile может быть прочитан.Цикл 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";
done
Выводится пять чисел от 1 до 5. Вот еще один пример:
for var in $PATH $MAIL $HOME
do
echo $var
done
Предположим, у вас есть каталог с файлами java и вы хотите скомпилировать их. Вы можете написать скрипт, например такой:
...
for file in *.java
do
javac $file
done
Примечание: Вы можете использовать wild-card выражения в ваших скриптах. Несколько специальных символов используемых в BASH shell скриптах
$* - Это означает, что все параметры передаются в скрипт на момент его исполнения. Что включает в себя $1, $2 и так далее.
$0 - Имя выполняемого скрипта.
$# - Количество аргументов, указанных в командной строке.
$? - Выходной статус последней команды.
Выше приведенные символы известны, как позиционные параметры (positional parameters). Позвольте мне объяснить позиционные параметры с помощью примера. Предположим у меня есть скрипт с названием my_script.sh. Теперь выполним этот скрипт в командной строке следующее:
$ ./my_script.sh linux is arobust OS
... как вы можете видеть выше, я указал 5 параметров скрипта. В соответствии с этим сценарием, значения позиционных параметров состоят в следующем:
$* - будет содержать значения '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
shift
Пример:
$ set `date`
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3
Чтобы узнать ID процесса текущего оболочки, попробуйте следующее:
$ echo $$
2667
Для проверки, что это одно и то же значение, выполните следующие команды:
$ ps -f |grep bash
Оператор readСделайте ваш скрипт интерактивным. 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