
Shell-coding: программируем в *nix-консоли
Xakep, номер #038, стр. 038-033-1
Автор: SHuRuP
Когда сидишь в консоли (а все мы с этим сталкиваемся), невольно хочется оптимизировать/упростить работу в ней. Как это сделать? Многие посоветуют учить С/С++, но зачем напрягаться больше, если есть способ проще?
У всех *nix-систем (современных) обязательно есть несколько командных интерпретаторов, вот самые известные из них:
Bourne Shell aka /bin/sh - именно он и будет рассматриваться в этой статье (инициализация - .profile);
Bourne-Again Shell aka /bin/bash - идентичен Bourne Shell (.profile и .bashrc);
C Shell aka /bin/csh - интерпретатор для C-программеров (.login и .cshrc).
Написание скриптов на Bourne Shell
Выполнение скриптов на sh равносильно набиранию всех этих команд с консоли. Все программы должны начинаться с:
#!/bin/sh
Комментарии начинаются с помощью символа '#'. Значения переменным задаются так:
var1=value
var1 - переменная, value - значение этой переменной. Дальше следует использовать данную переменную с символом '$' в начале ($var1). Существуют также другие возможности получения переменной:
${var1}text - отделяет значение $var1 от последующего текста (text);
${var1:=var2} - если значение $var1 не определено, то ей присваивается значение $var2;
${var1:-var2} - если значение $var1 не определено, то выводится значение $var2 ($var1 остается не определенным).
Пример простого скрипта:
#!/bin/sh
#script 1
var1=text1
var2=text2
echo ${var1}klm
#выведет text1klm
echo ${var1:=$var2}
#выведет text1
echo ${var4:=$var2}
#выведет text2
echo ${var4:-$var1}
#выведет text2
Некоторые переменные, используемые sh:
$$ - pid текущего shell'а;
$! - pid последнего процесса в фоновом режиме;
$? - код возврата последнего процесса;
$x - где x-числа: параметры, переданные скрипту ($0 - последний запущенный скрипт).
#!/bin/sh
#script 2
echo "script filename: $0"
#выведет название файла данного скрипта
echo "value1: $1"
#выведет первый параметр, заданный скрипту
echo "value2: $2"
#выведет второй параметр, заданный скрипту
Параметры скрипту задаются так:
/home/shurup/script1 value1 value2 value3
value1, value2, value3 - параметры для скрипта.
В Bourne Shell также возможно создание условий:
if [ условие ]
then действия при выполнении условия
else действия при невыполнении условия
fi
Пример использования:
#!/bin/sh
#script 3
if [ $1 == $2 ]
then echo "$1 равно $2"
else echo "$1 не равно $2"
fi
Циклы в sh создаются так:
while команда1
do
действие1
done
Действие1 будет исполняться до конца выполнения команды1.
Пример использования:
#!/bin/sh
#script 4
while :
do
echo test
done
В случае запуска этого скрипта команда 'echo test' будет выполняться в бесконечном цикле.
Для считывания информации в sh используется команда 'read'. Еще один пример использования циклов со считыванием информации:
#!/bin/sh
#script 5
cat ./sh_script5.txt | grep text1 |
while read text
do
if [ $text == "text1" ]
then echo "text1 был успешно найден в файле sh_script5.txt"
else echo "text1 не был найден в файле sh_script5.txt"
fi
done
Этот скрипт надо запускать из одного каталога с файлом sh_script5.txt. Файл sh_script5.txt выглядит примерно так:
text7
text45

















































































































