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

14.05.2008

Прежде всего позвольте мне уточнить, что это не будет детальное изучение скриптов оболочки, это будет быстрое руководство по на синтаксису, используемого в скриптах bash. Итак, если вы ждете другого, то тогда вы должны купить себе хорошую книгу по написанию сценариев. ;-) Итак, давайте перейдем к руководству.

-- Начала 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  Меньше или равно
Тест файлов
-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 --

Источник: 10 Seconds Guide to Bash Shell Scripting.

Статьи по теме:
Выбор диапазона IP адресов используя egrep - bash


Igor

05.12.2014

>Выше код реализует бесконечный цикл. Вы также можете написать 'в то время как справедливо' вместо 'а:'. Здесь я хотел бы ввести два >ключевых слова в связи с looping условные. Они перерыв и продолжить. Перерыв - Это ключевое слово вызывает контроль вырваться из петли. >далее - Это ключевое слово будет приостанавливать исполнение всех заявлений после него и выключатели контроль верхней части петли для >следующей итерации.

Волшебный гугл-транслятор =)

admin

18.03.2013

Cyril, спасибо поправил.

Cyril

15.03.2013

Тут ошибка:

> test $d -eq 25 ; echo $d
> ... что означает, если значение в переменной d равено 25, в выводим значение.

Вместо ';' должно быть '&&' - иначе это две последовательные команды.
Правильно:
test $d -eq 25 && echo $d

admin

15.03.2013

Alex, спасибо за замечание, поправил. Почему то ниже шел нормальный перевод, а выше этот странный кусок про параметры bash скрипта

Alex

21.02.2013

Быстро конечно, просто и понятно, но перевод ужасный
"my_script.sh - имя скрипт время казнен."

Alexx

23.06.2009

И мне понравилось, кратко и ясно. Я в закладочки добавил...

PavelVinogradov

08.09.2008

Хоть и не 10 секунд, но очень краткое и хорошее руководство по bash. Многие вещи понимал интуитивно, но не знал как они работают точно.






8 + 7 =

© 2001-2015 NLG