Содержание
Bash
Условие if...else...fi
Синтаксис:
if [ условие ] then если условие справедливо выполнить все команды до else или до fi else если условие не справедливо выполнить все команды до fi fi
вместо else можно использовать:
else if [ условие ]
или
elif [ условие ]
Операторы:
[ -b FILE ] Правда елси FILE существует и это специальный блоковый файл. [ -c FILE ] Правда елси FILE существует и это специальный знаковый файл. [ -d FILE ] Правда елси FILE существует и это директория. [ -e FILE ] Правда елси FILE существует. [ -f FILE ] Правда елси FILE существует и это регулярный файл. [ -g FILE ] Правда елси FILE существует и установлен SGID бит. [ -h FILE ] Правда елси FILE существует и это символический ссылка. [ -k FILE ] Правда елси FILE существует и второй промежуточный бит округления установлен. [ -p FILE ] Правда елси FILE существует и это named pipe (FIFO). [ -r FILE ] Правда елси FILE существует и он доступен на чтение. [ -s FILE ] Правда елси FILE существует и больше нуля. [ -u FILE ] Правда елси FILE существует и SUID (set user ID) бит установлен. [ -w FILE ] Правда елси FILE существует и он доступен на запись. [ -x FILE ] Правда елси FILE существует и он доступен на исполнение. [ -O FILE ] Правда елси FILE существует принадлежит существующему пользователю [ -G FILE ] Правда елси FILE существует принадлежит существующей группе. [ -L FILE ] Правда елси FILE существует и это символический ссылка. [ -N FILE ] Правда елси FILE существует и был изменен с тех пор как был прочитан. [ -S FILE ] Правда елси FILE существует и это сокет. [ FILE1 -nt FILE2 ] Правда, если файл FILE1 изменялся чаще чем FILE2, или есои FILE1 существует, а FILE2 нет. [ FILE1 -ot FILE2 ] Правда, если файл FILE1 старше чем FILE2, или FILE1 существует, а FILE2 нет. [ FILE1 -ef FILE2 ] Правда, если FILE1 и FILE2 относятся к одному устройству и номеру инода. [ -o OPTIONNAME ] Правда если shell опция "OPTIONNAME" включена. [ -z STRING ] Правда если длинна "STRING" равна 0. [ -n STRING ] or [ STRING ] Правда если длинна "STRING" не равна 0. [ STRING1 == STRING2 ] Правда если выражения эквивалентны. [ STRING1 != STRING2 ] Правда если выражения не эквивалентны. [ STRING1 < STRING2 ] Правда если "STRING1" лексикографически упорядоченно до "STRING2". [ STRING1 > STRING2 ] Правда если "STRING1" лексикографически упорядоченно после "STRING2". [[ STRING1 =~ regex_pattern ]] Правда если "STRING1" соответствует регулярному выражению "regex_pattern". [ ARG1 OP ARG2 ] "OP" это один из следующих параметров -eq, -ne, -lt, -le, -gt or -ge. Эти бинарные арифметические операторы возвращают результат "правда" если "ARG1" эквивалентен(-eq), не эквивалентен(-ne), меньше чем(-lt), меньше или эквивалентен(-le), больше чем(-gt), больше или эквивалентно(-ge) к "ARG2". [ ! EXPR ] правда если выражение EXPR не справедливо. [ ( EXPR ) ] возвращает значение EXPR. Это может быть использовано для изменения приоритета операторов. [ EXPR1 -a EXPR2 ] правда, если оба выражения EXPR1 и EXPR2 справедливы. [ EXPR1 -o EXPR2 ] правда, если хотя бы одно выражение EXPR1 или EXPR2 справедливы.
- &&, -a - и;
- ||, -o - или;
- ! – отрицание;
if [ условие ] && [ условие ]; then if [[ условие || условие ]]; then if ! [ условие ]; then
http://eddnet.org/?p=1311
http://kyrych.ru/linux/bash/30-shpargalka-po-logicheskim-operatsiyam-v-bash
Однострочник
[ "$a" == "1" ] && echo 1 || echo 0
Массив @
Создать массив (из списка, либо разделитель пробел):
array=( $(ls / -1) ) array=( $(ls /) )
Колличество элементов массиве:
echo ${#array[@]}
Первый элемент в массиве (2 варианта):
echo ${array:0} echo ${array[0]}
Все элементы:
echo ${array[@]}
Вывести все элемента после первого:
echo ${array[@]:1}
Вывести 4 элемента после второго:
echo ${array[@]:2:4}
Количество символов (длина) в первом элементе (отсчёт от 0)
echo ${#array[0]}
Перебор массива:
for i in ${array[@]} ; do echo $i ; done
Перебор массива от 1 до 5:
for i in {1..5} ; do echo $i ; done
Арифметические операции
Операторы:
- + сложение
- - вычитание
- * умножение
- / деление
- ** возведение в степень
- % модуль (деление по модулю), возвращает остаток от деления
- += увеличить значение переменной на заданное число
- -= уменьшить значения переменной на заданное число
- *= умножить значение переменной на заданное число
- /= разделить значение переменной на заданное число
- %= найти остаток от деления значения переменной на заданное число
Присваеваем число переменной n:
n=1
Сложение, прибавляем 5 (два варианта):
let "n += 5" n=$(($n + 5))
http://www.opennet.ru/docs/RUS/bash_scripting_guide/c2792.html
Переменные
- $_ - Код выхода последней команды
- ${0} - полный путь запускаемого с именем bash файла (d:\scripts\some-bash.sh)
- ${0%/*} - только путь запускаемого bash файла (d:\scripts\)
- $? - возвращаемое значение последней выполненной команды (код выхода)
- ${VAR,,} - преобразовать значение переменной VAR в строчные буквы
- ${#VAR} - кол-во символов в переменной
Установка переменных
Системные переменные устанавливаются в /etc/profile, /etc/bash.bashrc, /etc/environment
Логин сессия читает: ~/.bash_profile, ~/.bash_login и ~/.profile
Не-логин сессия читает: /etc/bash.bashrc, ~/.bashrc
Подсветка
Для новых пользователей в /etc/skel/.bashrc, для текущего в ~/.bashrc раскомментировать:
force_color_prompt=yes
Форматирование текста
Формат строки для основного цвета:
"\033[" + "<formatting code>;" + "<color code> + "m"
Сброс:
"\033[0m"
Пример жирного, подчёркнутого, мигающего красного текста:
echo -e "\\033[1;4;5;91mhello world\\033[0m"
https://habr.com/ru/companies/first/articles/672464/
https://wiki.archlinux.org/title/Bash_(Русский)/Prompt_customization_(Русский)
https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-bash-ps1-prompt
Примеры
Имя и путь к файлу
# Полный путь и имя файла fullpathname="/root/temp/file.tar.gz" # Директория dir=${fullpathname%/*} # Имя файла filename=${fullpathname##*/} # Расширение extension=${fullpathname##*.} # Замена расширения .docx на .doc newfilename=${filename%.docx}.doc fullpathname="/root/temp/file.tar.gz" echo "${fullpathname%%.*}" #/root/temp/file echo "${fullpathname%.*}" #/root/temp/file.tar echo "${fullpathname#*.}" #tar.gz echo "${fullpathname##*.}" #gz
http://youngblog.hoster-ok.com/bash-parsing-imeni-fajla-i-puti-k-nemu/
Вывод определённых строк
По номеру строки
В примере ниже выводятся строки 120, 145, 1050 файла syslog:
sed -n -e 120p -e 145p -e 1050p /var/log/syslog
начиная со строки номер 101, заканчивая строкой номер 110:
sed -n 101,110p /var/log/cron
Первые и последние строки
Первые 15 строк:
head -n 15 /var/log/syslog
Все строки файла кроме последних 250:
head -n -250 /var/log/syslog
Последние 25 строк:
tail -n 25 /var/log/syslog
Игнорировать первые 5 строк и показывать только оставшиеся строки:
tail -n +5 /var/log/syslog
Увеличивающийся лог в реальном времени
tail -f /var/log/syslog
Совпадающая строка по условию
Совпадающая строка и 5 строк после нее:
grep -A 5 "Initializing CPU#1" dmesg
Узнать внешний IP-адрес
Например, в консоли Linux / UNIX можно применить утилиты curl и wget:
curl -s ifconfig.me
Эта команда выведет вам в консоль IP-адрес, с которого вы видны внешнему миру.
Аналогичной задаче может послужить и утилита wget:
wget -O - -q icanhazip.com
или:
wget -O - -q ifconfig.me/ip
Существуют и другие, более длинные варианты:
lynx –source http://formyip.com/ | awk '/The/{print $5}' wget -q -O - http://formyip.com/ | awk '/The/{print $5}' wget -q -O - http://checkip.dyndns.com/ | awk '{print $6}' | sed 's/<.*>//'
Эти решения для определения внешнего IP-адреса удобно использовать на хостах без графического веб-браузера и в скриптах командной оболочки, например:
#!/bin/bash MYIP=$(wget -O - -q icanhazip.com); echo $MYIP;
Регистр
echo "HEllO" | tr '[:upper:]' '[:lower:]' echo "HEllO" | awk '{print tolower($0)}' VAR="HEllO"; echo "${VAR,,}" echo "HEllO" | sed -e 's/\(.*\)/\L\1/' echo "HEllO" | perl -ne 'print lc'
