Example Bash

help

# как узнать версию linux ###version ###linux ###redhat-release ###lsb_release ###uname ###
cat /etc/issue
cat /etc/*-release

syntax

# bash case ###bash ###case ###select
case "$VM_TMPLT_OS" in
centos-6*|centos6*)
        compat_centos6
        ;;
*)
        echo "TODO not support $VM_TMPLT_OS - skip"
        ;;
esac

find

# Найти все файлы исключая скрытые файлы и скрытые каталоги ###find ###exclude ###hidden
find $SRC -type f -not -path '*/\.*'
find . -name 'objects' -not -path '*.trash*'
 
# Найти и обработать файлы с пробелами ###find ###xargs
find . -print0 | xargs -0 -n10 echo 
 
# заменить во всех файлах по маске шаблону текст ###find ###sed
find . -type f -name '*.css' ! -path '*/.git/*' -exec sed -i 's/http:/https:/g' {} \;
или find . -type f | xargs -n 1 sed -i 's/fox-vz/fox_vz/'
 
# Поиск файлов ###find 
find /var/www/ -name "*.conf" -maxdepth 10
 
# Поиск без учёта регистра: ###find ###case
find /var/www/ -iname file.conf
 
# Поиск по размеру файлов ###find ###size
# size = 1024 bytes
find /home/user -size 1024c
#
# size > 10Mb
find /home/user -size +10M
 
# Поиск по маске прав ###find ###perm
find ./ -perm 700
 
# Поиск по дате ###find ###date ###time
# Файлы созданные или изменённые в течении последних 5 дней
# find /home/user -type f -mtime -5
#
# Файлы созданные или изменённые в течении последних 5 минут
# find /home/user -type f -mmin -5
#
# Найти файлы созданные или изменённые старше 30 дней (ака поиск устаревших файлов):
# find /home/user -type f -mtime +30
 
# Удалить файлы созданные или изменённые старше 30 дней: ###find ###delete
find /home/user -type f -mtime +30 -delete
 
# поиск и запуск внешней программы ###find ###exec
find ./ -type f -exec grep -i -H "STRING"  {} \;
 
# Найти все файлы php в который встречается строка STRING: ###find ###grep
find ./ -type f -name "*.php" -exec grep -i -H "STRING"  {} \;
 
# Найти все файлы за дату с 2017-09-11 по 2017-09-19 ###find ###date
find ./ -newermt '2017-09-11' \! -newermt '2017-09-19'
 
# Посчитать общий размер определенных файлов (например, файлов, которые старше 3х месяцев): ###find ### awk ###du
find /var/mail/test/ -type f -mtime +$((30*3)) -exec du {} \; | awk '{s+=$1} END {print s}'

strongbash

# создание carbon скрипта для strongbash ###bash ###init
#!/bin/bash
set -eu
# __SILENT=1 чтобы не выводить START и SUCCESS
. /opt/crab/crab_utils/bin/crab_sys.sh
sys::usage "$@"
### --help Info: Автоматически создавать и коммитить все файлы в каталоге
### --help Usage: auto_git.sh [install] /var/www/html
### --help Example: auto_git.sh /var/www/html
sys::arg_parse "$@"
### sys::arg_parse txt1 txt2 --name=a1 --dst=a2 --forced -t1 -y txt3
echo "$ARG_1==txt1 $ARG_2==txt2 $ARG_NAME==a1 $ARGV_DST==a2 $ARG_FORCED==TRUE $ARG_T==1 $ARG_Y=TRUE $ARG_3==txt3"
echo "${ARGV[1]}=txt1 ${ARGV[2]}==txt3 ${ARGV[3]}==txt3 ARGC=3"
for var in ${!ARG_@}; do echo $var ${!var}; done 
 
exit 0
 
# создание простого скрипта для strongbash ###bash ###init
#!/bin/bash
set -eu
echo "$0 $@ [$$] START" >&2
if [ "${1:---help}" = "--help" ]; then
         echo 'Info: Автоматически создавать и коммитить все файлы в каталоге'
         echo 'Usage: auto_git.sh [install] /var/www/html'
         echo 'Example: auto_git.sh /var/www/html'
         exit 0
fi
#
echo "$0 $@ [$$] SUCCESS" >&2
exit 0
 
# создание скрипта без crab_sys.sh для strongbash в котором много exit 0 ###bash ###init
#!/bin/bash
set -eu
echo "$0 $@ [$$] START" >&2
if [ "${1:---help}" = "--help" ]; then
         echo 'Info: Автоматически создавать и коммитить все файлы в каталоге'
         echo 'Usage: auto_git.sh [install] /var/www/html'
         echo 'Example: auto_git.sh /var/www/html'
         exit 0
fi
ARGV="$@"
__exit(){
        local ret=$1
        [ "$ret" = 0 ] && echo "$0 $ARGV [$$] SUCCESS" >&2 \
                || echo "$0 $ARGV [$$] FAILED" >&2
        exit $ret
}
 
cmd1
cmd2 || exit_success
cmd3
#
echo "$0 $@ [$$] SUCCESS" >&2
exit 0

Прочее

# запрет на подстановку * {} asterisk Disable pathname expansion. ###bash ###asterisk ###expansion
set -f
echo *
 
# перевод из unixtime в стандартную дату ###bash ###unixtime ###date
date -d @1458515485
date -d "1970-01-01 UTC 1458515485 sec" +%Y-%m-%d 
 
# форматированный вывод ###bash ###string ###printf ###echo ###hex ###binary
printf "%-7s %-7s %-11s %-12s %-10s %-8s %-11s %s" "vz: $vz_count" "kvm: $kvm_count" "mem: ${freemem}M" "space: ${freespace}G" "load: $loadavg" "hit: ${hit}%" "skip: ${skip}K"
 
# перевод формата ###bash ###string ###printf ###echo ###hex ###binary
# bin2hex
printf '%x\n' "$((2#101010101))"
# bin2dec
echo "$((2#101010101))"
# hex2dec
echo "$((0xff))"
# hex2bin
echo 'obase=2;ibase=16;FFFF0'|bc
echo 'obase=16;ibase=2;11110000'|bc
 
# перебрать все переменные начинающиеся с NET_IF ###bash ###string ###eval ###iterate ###foreach
for i in ${!NET_IF@}; do echo $i; done
 
# безопасный eval ###bash ###string ###eval 
eval declare '"$VAR_NAME"="$VAR_VAL"'
но declare не работает для глобальных переменных в функциях там можно делать хак
eval export -n '"$VAR_NAME"="$VAR_VAL"'
 
# взять слева с нулевого символа 3 символа ###substring ###bash ###string 
str=123456789; echo ${str:0:3} = 123
 
# взять справа от -4 символа 3 символа. Внимание! пробел перед " -4" обязателен  ###substring ###bash ###string 
echo ${a: -4:3} = 678
 
 
# Взять левую часть стоки. Обрезать строку справа до первых букв www  ###substring ###bash ###string 
str='1234 123 www www www asd zxc'
echo ${str%www*} = 1234 123 www www
# Взять левую часть стоки. Обрезать строку справа до последних букв www 
echo ${str%%www*} = 1234 123
 
# Взять правую часть стоки. Обрезать строку слева до первых букв www  ###substring ###bash ###string 
str='1234 123 www www www asd zxc'
echo ${str#*www} = www www asd zxc
# Взять правую часть стоки. Обрезать строку слева до последних букв www
echo ${str##*www} = asd zxc
 
 
# заменить переводы строк на пробелы ###bash ###string ###strreplace
a="${a//$'\n'/ }"
 
# Удалить все файлы кроме 10 последних по дате модификации, полезно для бекапов и логов ###bash ###script 
[ `ls -1  | wc -l` -gt 10 ] && ls -1t | tail -n +10 | xargs -x /bin/echo rm
 
# Удалить все файлы кроме 10 последних по имени файла вида 09.07.15_15-40.sql.bz2, полезно для бекапов и логов ###bash ###script
[ `ls -1  | wc -l` -gt 10 ] && ls -1  | sort  | head -n 2 | xargs -x /bin/echo rm
 
# Удобный bash history ###bash ###bashrc ###history
cat $HOME/.bashrc
export HISTSIZE=10000
export HISTCONTROL="ignoreboth"
shopt -s histappend
shopt -s cmdhist
export HISTTIMEFORMAT="%F %T "
function prompt_cmd(){
         history -a &>/dev/null;
         if ! tail -n 1 ~/.bash_history | grep -qm1 "${SSH_CLIENT *}"; then
                 echo -e "#$(date +%s)\n  ${SSH_CLIENT *}">>~/.bash_history;
         fi
}
PROMPT_COMMAND=prompt_cmd
 
# Пример удобного логирования ###bash ###log
 echo "$(date +'%Y-%m-%d %H:%M:%S') $HOSTNAME ${0##*/}[$$]: $@"
 
# Заменить во всех файлах слова ###sed
sed -i 's/что_менять/на_что_менять/' /path/to/files/*
 
# Удалить строки, содержащие слова ###sed
sed -i '/что_искать/d' /path/to/files/*
 
# напечатать, то что находится в скобке ###sed
sed -n 's/.*href="\/\([^"]*\).*/\1/p'
 
###regexp
[abc]	Один из символов a, b, c	.	Любой символ	(...)	Группировка (группа)
[^abc]	Любой символ кроме a, b, c	\s	Пробельный символ (в т.ч. табуляция)	(a|b)	a или b
[a-z]	Любой символ из диапазона	\S	Любой не пробельный символ	a?	Одна a или пусто
[a-zА-Я]	Любой символ из диапазонов	\d	Любая цифра	a*	Ноль и более раз a
^	Начало строки	\D	Не цифра	a+	Один и более раз a
$	Конец строки	\w	Буква (буквы, цифры, подчеркивание)	a{3}	3 раза a
\A	Начало текста	\W	Не буква (специальные символы)	a{3,}	3 и более раз a
\z	Конец текста	\b	Граница слова (начало или конец)	a{3,5}	От 3 до 5 раз a
\n	Символ новой строки в Unix	\r\n	Символ новой строки в Windows	\t	Символ табуляции
\pL	Буква (в т.ч. русская) в кодировке utf-8, используется с модификатором u
Модификаторы
i	Регистронезависимость. Например "/a/i" ищет и a, и A.
U	Инвертирует "жадность" (по умолчанию жадный, т.е. пытается захватить как можно большую строку, подходящую по условию).
u	Использование кодировки utf-8 (для поиска русского текста например).
m	Многострочный поиск.
s	Символ . (точка) соответствует и переводу строки.
x	Игнорировать пробелы. В этом случае пробелы нужно экранировать обратным слэшем \.
 
###bash ###string
${#name}    Длина строки 	nick 	-> 4
${name%i*}  Удалить наименьшую подстроку "i*" с конца строки 	"Nick Denisov" ->	"Nick Den"
${name%%i*} Удаляет наибольшую подстроку "i*" с конца строки 	"Nick Denisov" ->	"N"
${name#*i}  Удаляет наименьшую подстроку "*i" с начала строки 	"Nick Denisov" ->	"ck Denisov"
${name##*i} Удаляет наибольшую подстроку "*i" с начала строки 	"Nick Denisov" -> "sov"
${name:5}   Извлечение среза из строки 	"Nick Denisov" -> 	"Denisov"
${name: -1} Извлечение среза из строки с конца строки, пробел перед тире обязателен 	"Nick Denisov" -> 	"v"
${name:5:5} Извлечение среза из строки, начиная с 5, но не более 5 символов 	"Nick Denisov" -> 	"Denis"
${name/Denisov/surname} Поиск подстроки в строке, первое совпадание с шаблоном заменяется подстрокой 	"Nick Denisov" -> "Nick surname"
${name//i/I} 	        Глобальная замена. Все найденные совпадения с шаблоном i в name, будут замещены подстрокой I 	"Nick Denisov" -> "NIck DenIsov"
${name/#Nick/Kolya} 	Если в переменной найдено совпадение в начале строки (префикс), то оно заменяется. Поиск ведется с начала строки 	"Nick Denisov" -> "Kolya Denisov"
${name/%Denisov/Kolya} 	Если в переменной найдено совпадение в конце строки (суффикс), то оно заменяется. Поиск ведется с конца строки 	"Nick Denisov" -> "Nick Kolya"

~~OWNERAPPROVE~~

Ваш комментарий. Вики-синтаксис разрешён: