Open Way | Systems | Distro | Shell | Desktop | Applications
Network | Development | Download | OfftopicКарта сайта
FreeNotesФорум POSIX.ru
На главную страницу

Tips от Madskull'a: bash

Сергей Майков aka Madskull
http://www.mdsk.ru
2005.11.25

Перехватывание вывода от команд, подобных timeВ начало

( time ls *txt 2>&1 ) 2>file


Ожидание запущенных в фоне задачВ начало

{ command1 & pid1=$! ;}; { command2 & pid2=$! ;}; wait $pid1 $pid2


Прерывание по таймеру (SIGALRM)В начало

TIME=10	 # прерывание через 10 секунд
trap 'exit' ALRM 
( sleep $TIME && kill -ALRM "$$" ) &


Параметры в скриптах и функцияхВ начало

func()
{
	echo $1
	echo "---"
	for i in "$*"; do echo $i; done
	echo "---"
	for i in "$@"; do echo $i; done
	echo "---"
	for i in $*; do echo $i; done
}

$ func "aaa bbb" "ccc ddd"
aaa bbb
---
aaa bbb ccc ddd
---
aaa bbb
ccc ddd
---
aaa
bbb
ccc
ddd


МассивыВ начало

$ array=("aaa bbb" "ccc ddd")
$ echo ${#array[@]}  # количество элементов
2

$ for i in "${array[@]}"; do echo $i ; done # просмотр всех элементов
aaa bbb
ccc ddd

$ for i in "${array[*]}"; do echo $i ; done # весь массив как одна строка
aaa bbb ccc ddd

$ for i in ${array[@]}; do echo $i ; done   # разделитель элементов в массиве теперь $IFS
aaa
bbb
ccc
ddd

$ for ((i=0; $i<${#array[@]}; i++)); do echo ${array[$i]}; done # еще один способ обращения к элементам массива
aaa bbb
ccc ddd


trap: ловим прерыванияВ начало

trap 'echo словили ERR' ERR   # псевдосигнал, отрабатывает при ошибке в скрипте
trap 'echo словили EXIT' EXIT # псевдосигнал, отрабатывает при выходе из скриптa
	# EXIT должен быть определен перед остальными ловушками
trap 'echo словили SIGTERM; exit 1' SIGTERM   # kill -15
trap 'echo словили INT; exit 1' INT           # ^C или kill -2
trap 'echo словили HUP; exit 1' HUP           # разрыв соединения или kill -1

# для для игнорирования сигнала
trap '' INT	# ^C фтопку

# можно определить обработчик и отдельно
trapINT()
{
	echo "убери руки!"
}

trap trapINT INT


Прогрессбар в bash-скриптахВ начало

# usage: progress <максимум> <текущее_положение>
PB_NOPERC=1	# если определена, не выводятся проценты
PB_NOITEM=1	# если определена, не выводится текущее_положение/максимум

progress()
{
	local width=50
	local max=$1 curr=$2 pos=$width perc=100
	if [ $curr -lt $max ]; then
		pos=$((curr*width/max))
		perc=$((curr*100/max))
	fi
	local str="\r[$(printf "%${pos}s" \
		| sed 's/ /#/g')$(printf "%$((width-$pos))s" \
		| sed 's/ /-/g')]"
	[ -z "$PB_NOPERC" ] && str="$str $perc%"
	[ -z "$PB_NOITEM" ] && str="$str ($curr/$max)"
	echo -ne $str
	[ $perc -eq 100 ] && echo
}


Чтение конфигов в скриптеВ начало

IFS=$'\n'
for str in `cat ini | sed 's/^ *//' | egrep -v '^$|^#'`; do
	eval $(echo $str|sed 's/ *=/=/;s/= */=/')
done
echo $var
ini содержит:
# коммент
var = value


Работа со строкамиВ начало

${#string}	Длина строки

Извлечение подстроки

${string:position}		# с position до конца
${string:position:length}	# с position длиной length символов
${string: -length}		# последние length символов

Удаление части строки

${string#substring}	# до первого с начала
${string##substring}	# до последнего с начала
${string%substring}	# до первого с конца
${string%%substring}	# до последнего с конца

Замена подстроки

${string/substring/replacement}	# первое вхождение
${string//substring/replacement}	# все вхождения
${var/#Pattern/Replacement}	# Если в переменной var найдено совпадение с Pattern, 
       причем совпадающая подстрока расположена в начале строки (префикс), 
       то оно заменяется на Replacement. Поиск ведется с начала строки
${var/%Pattern/Replacement}	# Если в переменной var найдено совпадение с Pattern, 
       причем совпадающая подстрока расположена в конце строки (суффикс), 
       то оно заменяется на Replacement. Поиск ведется с конца строки


Подстановка параметровВ начало

(Символ : имеет значение только когда parameter инициализирован "пустым" значением)

${!ref}	# косвенная ссылка на переменную
var='str'
ref='var'
echo ${!ref}	# str

${parameter-default}, ${parameter:-default}
Если параметр отсутствует, то используется значение по-умолчанию.

${parameter=default}, ${parameter:=default}
Если значения параметров не задананы явно, то они принимают значения по-умолчанию.

${parameter+alt_value}, ${parameter:+alt_value}
Если параметр имеет какое либо значение, то используется alt_value, иначе -- null ("пустая" строка).

${parameter?err_msg}, ${parameter:?err_msg}
Если parameter инициализирован, то используется его значение, в противном случае -- выводится err_msg.

${!varprefix*}, ${!varprefix@}
Поиск по шаблону всех, ранее объявленных переменных, имена которых начинаются с varprefix.


getoptsВ начало

while getopts ":ab:c" Option
# Начальное объявление цикла анализа опций.
# a, b, c -- это возможные опции (ключи).
# Символ : после опции 'b' указывает на то, что с данной опцией может идти
# дополнительный аргумент.
do
  case $Option in
    a ) # Действия, предусмотренные опцией 'a'.
    b ) # Действия, предусмотренные опцией 'b', а так же необходимо обработать $OPTARG,
        # в которой находится дополнительный аргумент этой опции.
    ...
    c ) # Действия, предусмотренные опцией 'c'.
  esac
done
shift $(($OPTIND - 1))


ПеременныеВ начало

$#	- количество переданных параметров
обращение к последнему параметру:
args=$#
last=${!args}

!	- косвенное обращение к переменным
var1="string"
var2="var1"
echo ${!var2}	# string

$-	Список флагов, переданных сценарию (командой set).

$_	Специальная переменная, содержит последний аргумент предыдущей команды.

$!	PID последнего, запущенного в фоне, процесса

$$	PID самого процесса-сценария.

$?	код завершения.

$FUNCNAME	имя текущей функции

$LINENO	Номер строки исполняемого сценария. 

$OLDPWD	прежний рабочий каталог ("OLD-Print-Working-Directory")

$PIPESTATUS	Код возврата канала (конвейера).
Переменная $PIPESTATUS может давать неверные значения при вызове из командной строки.
bash$ who | grep nobody | sort
bash$ echo ${PIPESTATUS[*]}

$PPID	Переменная $PPID хранит PID (идентификатор) родительского процесса.

$PWD	рабочий (текущий) каталог


Цвета ECHOВ начало

BOLD='\e[1m'
UNDERLINE='\e[4m'
BLINK='\e[5m'
INVERSE='\e[7m'
BREAK='\e[m'

#Foreground colors:
BLACK='\e[0;30m'
RED='\e[0;31m'
GREEN='\e[0;32m'
BROWN='\e[0;33m'
BLUE='\e[0;34m'
MAGENTA='\e[0;35m'
CYAN='\e[0;36m'
GRAY='\e[0;37m'
DEF='\e[0;39m'
DGRAY='\e[1;30m'
LRED='\e[1;31m'
LGREEN='\e[1;32m'
YELLOW='\e[1;33m'
LBLUE='\e[1;34m'
LMAGENTA='\e[1;35m'
LCYAN='\e[1;36m'
WHITE='\e[1;37m'

# backgrounds colors
BLACK='\e[40m'
RED='\e[41m'
GREEN='\e[42m'
BROWN='\e[43m'
BLUE='\e[44m'
MAGENTA='\e[45m'
CYAN='\e[46m'
GRAY='\e[47m'
DEF='\e[49m'


СпецсимволыВ начало

-	предыдущий рабочий каталог. Соответствует содержимому внутренней переменной $OLDPWD.

~+	текущий рабочий каталог. Соответствует содержимому внутренней переменной $PWD.

:	символ заполнитель в операция с двумя операндами
создать пустой файл
: > file

ввод одинарной кавычки в строку в одинарных кавычках:
echo 'str'\''ing'   # str'ing

Специальное назначение некоторых экранированных символов
используемых совместно с echo и sed

\n	перевод строки (новая строка)
\r	перевод каретки
\t	табуляция
\v	вертикальная табуляция
\b	забой (backspace)
\a	"звонок" (сигнал)
\0xx	ASCII-символ с кодом 0xx в восьмеричном виде)


Некоторые командыВ начало

shopt -s expand_aliases
Дает возможность использовать алиасы в скриптах

expand, unexpand
Команда expand преобразует символы табуляции в пробелы. Часто используется в конвейерной обработке текста.
Команда unexpand преобразует пробелы в символы табуляции. Т.е. она является обратной по отношению к команде expand.

fold
Выравнивает текст по ширине, разрывая, если это необходимо, слова. Особый интерес представляет ключ -s, который производит перенос строк по пробелам, стараясь не разрывать слова.

column
Форматирование по столбцам. Эта утилита преобразует текст, например какой либо список, в табличное, более "удобочитаемое", представление, вставляя символы табуляции по мере необходимости.

colrm
Утилита удаления колонок. Удаляет колонки (столбцы) символов из файла и выводит результат на stdout. colrm 2 4 &gt;filename -- удалит символы со 2-го по 4-й включительно, в каждой строке в файле filename.

readlink
Возвращает имя файла, на который указывает символическая ссылка.

od
Команда od (octal dump) производит преобразование ввода (или файла) в один или несколько форматов, в соответствии с указанными опциями.

join
Слияние двух файлов по ключам




Тоники, бальзамы и
шампуни Schwarzkopf.ru . 1с:Бухгалтерия - электронная отчетность. . консультант плюс для бухгалтера