SDB:Советы и приёмы в Bash
Содержание
- 1 Подсказки Bash
- 1.1 Ожидание запущенных в фоне задач
- 1.2 прерывание по таймеру (SIGALRM)
- 1.3 параметры в скриптах и функциях
- 1.4 массивы
- 1.5 trap: ловим прерывания (updated)
- 1.6 Прогрессбар в bash-скриптах
- 1.7 Чтение конфигов в скрипте
- 1.8 Работа со строками
- 1.9 Подстановка параметров
- 1.10 Переменные
- 1.11 Цвета ECHO
- 1.12 Спецсимволы
- 1.13 Некоторые команды
Подсказки Bash
Ожидание запущенных в фоне задач
{ 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 # aaa # bbb # ccc # ddd
for ((i=0; $i<${#array[@]}; i++)); do echo ${array[$i]}; done #aaa bbb #ccc ddd
trap: ловим прерывания (updated)
trap 'echo словили ERR' ERR # псевдосигнал, отрабатывает при ошибке в скрипте
trap 'echo словили EXIT' EXIT # псевдосигнал, отрабатывает при выходе из скрипта # 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 >filename
удалит символы со 2-го по 4-й включительно, в каждой строке в файле filename.
readlink
Возвращает имя файла, на который указывает символическая ссылка.
od
Команда od (octal dump) производит преобразование ввода (или файла) в один или несколько форматов, в соответствии с указанными опциями.
join
Слияние двух файлов по ключам.
Стегний Павел --Adramelech 23:36, 4 января 2009 (UTC)