Base
Литерал - строка , заключенная в одиинарные кавычки и передаваемая в командной строке в качестве аргумента ,
например :
grep 'r.*t' /etc/passwd
Двойные кавычки работают по-другому - например в команде
echo "There is my path: $PATH"
будет выведено значение переменной PATH .
Незакрытую одинарную кавычку надо предварять бак-слэшем :
echo I don\'t like contractions inside shell scripts.
В шелле есть ряд специальных переменных , значение которых изменить нельзя - это ряд
$1, $2, ...
Они включают в себя значение скриптовых параметров-аргументов .
Если в скрипте записать 2 строки :
echo первый аргумент: $1
echo третий аргумент: $3
назвать этот скрипт pshow и запустить команду
pshow раз два три
то будет распечатано :
раз
три
Команда shift удаляет эти переменные из списка , начиная с $1 . Например запишем в pshow :
echo Argument: $1
shift
echo Argument: $1
shift
echo Argument: $1
shift
Команда pshow раз два три распечатает
Argument: раз
Argument: два
Argument: три
Переменная $# хранит число аргументов , она используется в цикле при проходе
через массив переменных с помощью команды shift .
Переменная $@ хранит все скриптовые аргументы сразу .
Переменная $0 хранит имя скрипта .
Например :
echo $0: у этого скрипта следующие плохие параметры : $BADPARM 1>&2
ошибка в данном случае будет выведена в поток error .
Для вывода в поток output :
echo $0: у этого скрипта следующие плохие параметры : $BADPARM 2>&1
Переменная $$ хранит ID-шник шелловского процесса .
Переменная $? хранит exit code для последней выполненной шеллом команды .
Когда программа заканчивает работу , она посылает exit code родительскому процессу ,
которое представляет из себя число . Если оно равно нулю , то нет проблем .
Если сначала запустить команду
ls / > /dev/null
а потом
echo $?
будет распечатан 0 .
Если же сначала запустить такую команду
ls /фываыфва > /dev/null
а потом
echo $?
будет распечатано 1 .
Если при работе скрипта возможны ошибки , их желательно обрабатывать и программно генерировать с помощью
exit 1
Некоторые программы возвращают свои собственные exit code . Так , diff или grep возвращают 1 в случае нахождения шаблона .
В качестве ошибки они возвращают 2 .
Конструкция условия в шелле стандартная - это if/then/else :
if [ $1 = hi ]; then
echo 'Первый аргумент был "hi"'
elif [ $2 = "bye" ]; then
echo 'Второй аргумент был "bye"'
else
echo -n 'Первый аргумент не был "hi" -- '
echo Он был '"'$1'"'
fi
Символ [ - квадратные скобки - есть обязательный признак выполнения условия if .
Если переменная $1 оказалось пустой , это можно обработать так :
if [ "$1" = hi ]; then
Вместо символа [ можно использовать grep :
if grep -q daemon /etc/passwd; then
echo The daemon user is in the passwd file.
else
echo There is a big problem. daemon is not in the passwd file.
fi
Дополнительные логические условия && и || могут быть использованы так :
if [ "$1" = hi ] || [ "$1" = bye ]; then
...
fi
Для проверки наличия существвания файла можно запустить
[ -f file ] >
Типы файлов :
-f - Regular file
-d - Directory
-h - Symbolic link
-b - Block device
-c - Character device
-p - Named pipe
-S - Socket
Следующие операторы проверяют файловые пермишины :
-r - Readable
-w - Writable
-x - Executable
-u - Setuid
-g - Setgid
-k - Sticky
Еще одна команда сравнивает 2 файла по дате модификации
[ file1 -nt file2 ]
При сравнении 2-х строк используются операторы = и != .
Также есть 2 унарных операции проверки на пустоту строки:
[ -z "" ] returns 0
[ -n "" ] returns 1
Для сравнения чисел нужно использовать оператор eq :
[ 01 -eq 1 ]
Также возможны следующие унарные операции сравнения для чисел :
-eq - равно
-ne - не равно
-lt - меньше
-gt - больше
-le - меньше или равно
-ge - больше или равно
Оператор case применяется так :
case $1 in
bye)
echo Fine, bye.
;;
hi|hello)
echo Nice to see you.
;;
what*)
echo Whatever.
;;
*)
echo 'Huh?'
;;
esac
В шелле существуют 2 разновидности циклов - for и while . например :
for str in one two three four; do
echo $str
done
Или так :
FILE=/tmp/whiletest.$$;
echo firstline > $FILE
while tail -10 $FILE | grep -q firstline; do
echo -n Number of lines in $FILE:' '
wc -l $FILE | awk '{print $1}'
echo newline >> $FILE
done
rm -f $FILE
Есть также until - версия цикла , похожая на while . Рекомендуется использовать for .
В шелле можно использовать output в качестве аргумента другой команды или сохранить его в переменной .
В следующем примере результат работы команды grep передается в качестве аргумента команде sed :
FLAGS=`grep ^flags /proc/cpuinfo | sed 's/.*://' | head -1`
echo Your processor supports:
for f in $FLAGS; do
case $f in
fpu) MSG="floating point unit"
;;
3dnow) MSG="3DNOW graphics extensions"
;;
mtrr) MSG="memory type range register"
;;
*) MSG="unknown"
;;
esac
echo $f: $MSG
done
Иногда возникает необходимость в создании временных файлов , для этого можно использовать команду mktemp.
В следующем примере показано , как вывести прерывания за последние 2 секунды :
TMPFILE1=`mktemp /tmp/im1.XXXXXX`
TMPFILE2=`mktemp /tmp/im2.XXXXXX`
cat /proc/interrupts > $TMPFILE1
sleep 2
cat /proc/interrupts > $TMPFILE2
diff $TMPFILE1 $TMPFILE2
rm -f $TMPFILE1 $TMPFILE2
При этом mktemp конвертирует расширение XXXXXX в уникальный набор символов .
Утилита basename используется для выделения расширения из имени файла или избавления в имени файла от пути :
basename example.html .html
basename /usr/local/bin/example
В следующем скрипте выполняется конвертация gif-файла в png :
for file in *.gif; do
# exit if there are no files
if [ ! -f $file ]; then
exit
fi
b=`basename $file .gif`
echo Converting $b.gif to $b.png...
giftopnm $b.gif | pnmtopng > $b.png
done
awk - это не только полезная утилита , но и целый язык . С ее помощью можно , например , распечатать размеры
файлов директории :
ls -l | awk '{print $5}'
sed - редактор потоков . sed получает набор строк для редактирования , а также набор правил для этого .
Например , следующая команда удаляет в файле строки с 3-й по 6-ю :
sed 3,6d /etc/passwd
Другая полезная команда в sed - s - поиск или замена .
Следующая команда делает замену шаблона exp на text
sed 's/exp/text/'
Следующая команда делает то же самое , но для всех text
sed 's/exp/text/g'
Следующая строка удаляет все строки , соответствующие шаблону :
sed '/exp/d'
expr - команда для выполнения арифметических операций . Например :
expr 1+2
Выполните expr --help для распечатки полного списка .
subshells - это дочерний процесс , запускаемый в текущем шелле . Вызывается :
(cd subsheldi; subshellprog)
При этом все переменные родительского процесса сохраняются в дочернем .
Например , в следующем примере создается архив текущего каталога , и распаковка происходит с помощью
subshell уже в другом каталоге :
tar cf - orig | (cd target; tar xvf -)
Для включения в шелл других скриптов используйте оператор . (точка)
Команда read читает инпут и сохраняет его в переменной :
read myvar
|
|