10 секундное руководство по Bash Shell Scripting

Общие переменные окружения
PATH - Устанавливает путь поиска для любой исполняемый командой. Аналогично переменной PATH в MSDOS.
HOME - домашний каталог пользователя.
MAIL - Содержит путь к месту хранрения почты пользователя.
IFS - Содержит строку символов, которые используются как разделители в командной строке. Строка, как правило, состоит из пробела, табуляции и символы новой строки. Чтобы увидеть их придется сделать восьмеричный дамп следующим образом:

$ echo $IFS | od -bc

PS1 и 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.sh

3) Обычно скрипт имеет расширение .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 Меньше или равно

Тест файлов ж-файл р-файл ж-файл - х файл - д файл ы-файл True если файл существует и имеет размер больше чем ноль.

-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 выражения в ваших скриптах.

Несколько специальных символов и их значения w.r.t shell scripts

$* - Это означает, что все параметры передаются скрипт
на момент его исполнения.. Что включает в себя $ 1, $ 2
и так далее.
$0 - Имя выполняемого скрипта.
$# - Количество аргументов, указанных в командной строке.
$? - Выходной статус последней команды.

Выше приведенные символы известны, как позиционные параметры (positional parameters). Позвольте мне объяснить позиционные параметры с помощью примера. Предположим у меня есть скрипт с названием my_script.sh. Теперь выполним этот скрипт в командной строке следующее:

$ ./my_script.sh linux is a robust OS

... как вы можете видеть выше, я указал 5 параметров скрипта. В соответствии с этим сценарием, значения позиционных параметров состоят в следующем: $ * - "linux ',' является ',' ',' надежных ',' OS". $ 0 - my_script.sh - имя скрипт время казнен. $ # - $ $ - $ 1 - $ 2 - $* - будет содержать значения 'linux','is','a','robust','OS'.
$0 - будет содержать значение my_script.sh - имя скрипта во время исполнения.
$# - содержит значения 5 - общее количество параметров.br>

$$ - Содержит 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, если нет. Это может быть проверено в скрипте, используя $?.