Содержание

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 справедливы.
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

https://losst.ru/massivy-bash

Арифметические операции

Операторы:

Присваеваем число переменной n:

n=1

Сложение, прибавляем 5 (два варианта):

let "n += 5"
n=$(($n + 5))

http://www.opennet.ru/docs/RUS/bash_scripting_guide/c2792.html

Переменные

https://help.ubuntu.com/community/EnvironmentVariables

Установка переменных

Системные переменные устанавливаются в /etc/profile, /etc/bash.bashrc, /etc/environment
Логин сессия читает: ~/.bash_profile, ~/.bash_login и ~/.profile
Не-логин сессия читает: /etc/bash.bashrc, ~/.bashrc

Задать переменную

Задать переменную

Окружения:

export VARIABLE=environment

Оболочки:

VARIABLE=shell

Вывести переменную

Вывести переменную

Окружения:

env | grep VARIABLE
printenv VARIABLE

Оболочки:

set | grep VARIABLE

Удалить переменную

Удалить переменную

unset VARIABLE

Только окружения:

export -n VARIABLE

Значение по умолчанию

Значение по умолчанию

VARIABLE=${VARIABLE:=var} #если переменной не существует
: "${VARIABLE:=var} #если переменной не существует или пустая"

Подсветка

Для новых пользователей в /etc/skel/.bashrc, для текущего в ~/.bashrc раскомментировать:

force_color_prompt=yes

Форматирование текста

Формат строки для основного цвета:

"\033[" + "<formatting code>;" + "<color code> + "m"

Сброс:

"\033[0m"

Таблица форматирования

Таблица форматирования

ФорматКод
Стандартный0
Жирный1
Тёмный2
Курсивный3
Подчёркнутый4
Мигающий5,6
Инвертированный7
Прозрачный8
Зачёркнутый9

Таблица цвета

Таблица цвета

ЦветТекстФон
Стандартный3949
Чёрный3040
Тёмно-красный3141
Тёмно-зелёный3242
Тёмно-жёлтый «Оранжевый»3343
Тёмно-синий3444
Темно-пурпурный3545
Тёмно-голубой3646
Светло-серый3747
Тёмно-серый90100
Красный91101
Зелёный92101
Оранжевый93103
Синий94104
Пурпурный95105
Голубой96106
Белый97107


Пример жирного, подчёркнутого, мигающего красного текста:

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

http://gnu.su/news.php?extend.1464

Узнать внешний IP-адрес

Например, в консоли Linux / UNIX можно применить утилиты curl и wget:

curl -s ifconfig.me

Эта команда выведет вам в консоль IP-адрес, с которого вы видны внешнему миру.

Аналогичной задаче может послужить и утилита wget:

wget -O - -q icanhazip.com

или:

wget -O - -q ifconfig.me/ip

Существуют и другие, более длинные варианты:

lynxsource 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'