Tool.Yun
Зручні інструменти для розробників
CSV в JSON
JS в JSON
JSON в C#
JSON в CSV
JSON в Go
JSON в JS
JSON в TOML
JSON в об'єкт
JSON до MessagePack
JSON до TS
JSON до даних
JSON у .env
JSON у Java
JSON у PHP-масив
JSON у XML
JSON у схему
Json до SQL DDL
Json на Python
Json у PHP код
Json-запит
ObjGen у JSON
PHP-масив у JSON
tools.json-patch.name
Аналізатор розміру JSON
Екранування/Розекранування JSON
Зведення/розведення JSON
Злиття JSON
Конвертер JSON в YAML
Конвертер JSON рядків
Лінтер JSON
Майстер сортування JSON
Мінімізація JSON
Пакування повідомлень у JSON
Порівняння JSON
Редактор JSON
Тестер Jq/JSONPath
Форматування JSON
PDF-компресор
PDF-конкатенер
Екстрактор сторінок PDF
Екстрактор тексту PDF
З HTML у PDF
Лінеаризація PDF/Швидкий веб
Перевірка підпису PDF
Розблокування PDF
Шифрування PDF
TOML в JSON
TOML в YAML
TOML-лінтер
ObjGen у HTML
XML у JSON
XML-лінтер
Тестер XPath
Тестер XSLT
Форматування XML
YAML в TOML
Зведення/розведення YAML
Злиття YAML
Конвертер YAML в JSON
Форматування YAML
Вибір карт
Кидок кубика
Колесо фортуни
Монетний кидок
HTML WYSIWYG редактор
HTML до даних
MIME типи
Інформація про пристрій
Генератор SVG placeholder
Генератор UTM URL
Генератор градієнтів CSS
Генератор текстових фрагментів URL
Дефангер URL
Екранування HTML сутностей
З HTML до XHTML
Зображення у CSS
Коди стану HTTP
Кодування/декодування URL-форматованих рядків
Колесо кольорів
Конвертер CSS XPath
Конвертер REM у пікселі
Конвертер кольорів
Конвертер одиниць CSS
Мініфікатор HTML
Очищувач HTML
Очищувач URL
Парсер User-agent
Перевірка контрастності кольорів
Перетворення рядка (slug)
Форматувач CSS
Форматувач HTML
Калькулятор відсотків
Калькулятор гео-дистанції
Калькулятор співвідношення сторін
Конструктор бенчмарків
Генератор BIP39 паролів
Генератор NanoID
Генератор OTP кодів
Генератор PIN-кодів
Генератор UUID
Генератор випадкових чисел
Генератор нумеронімів
Генератор паролів
Генератор паролів Diceware
Генератор токенів
Конвертер UUID
Валідатор Luhn
Валідатор номерів ПДВ
Валідатор та парсер IBAN
Валідатор та парсер ISBN
Калькулятор SLA
Калькулятор ІМТ
Калькулятор темпу бігу
Конвертер валют
Конвертер календарів
Конвертер чисел RMB
Онлайн-словник
Парсер та форматувач телефонів
Перевірка кредитних карток
Пошук Unicode
Пошук кодів країн ISO 3166
Пошуковий інструмент ISO 639
Поясніть команду оболонки
Рекомендації IES з освітлення
Сумісність ліцензій програмного забезпечення
Cron/Будильник на будні
Будильник часу
Генератор ICAL
Зворотний відлік
Калькулятор ETA
Калькулятор TTL
Калькулятор дати+тривалості
Калькулятор днів
Калькулятор тривалості
Конвертер дати та часу
Конвертер номерів тижнів
Конвертер часових поясів
Об'єднувач iCal
Парсер ICAL файлів
Хронометр
Який день?
Docker Compose у Kubernetes
Docker Compose у квадлети
Docker Compose у файл .env
Docker run у Kubernetes
Docker запуск до квадлетів
Валідатор Docker Compose
Від перевірки Docker до запуску Docker
Генератор RBAC Kubernetes
Генератор міток Dockerfile
Завантажувач образів Docker
Конвертер Docker Compose у Docker run
Конвертер Docker run в Docker compose
Конвертер формату Docker Compose
Конструктор творів у Traefik Docker
Мітки Docker Pangolin
Конструктор виразів Cron
GIF у MP4
OCR зображень та PDF
Інвертор кольору зображення
Видалення EXIF
Видалити фон зображення
Водяний маркер
Запис з камери
Зміна розміру зображення
Зображення у SVG (potrace)
Конвертер HEIC
Конвертер ICO/PNG
Конвертер зображень
Обрізати зображення
Попередній перегляд SVG
Порівняння зображень
Читач EXIF/метаданих зображень
CSV до даних
Excel до даних
Torrent у Magnet
Генератор ULID
Конвертер Base64 Hex масивів
Конвертер багатьох одиниць
Конвертер властивостей
Конвертер географічних координат
Конвертер дБм мВт
Конвертер одиниць зберігання даних
Конвертер римських цифр
Конвертер рядків base64
Конвертер символів Unicode у Java сутності
Конвертер файлів Base64
Конвертер форматів змінних середовища
Конвертер числових систем
Нормалізатор електронної пошти
Обчислювач енергії
Текст у Unicode
Текст у двійковий ASCII
AGE Криптографія
Argon2 Хешер
Bcrypt
PGP шифрування
RSA шифрування
RSA/DSA/ECDSA підпис та перевірка
SAML-парсер
Байти Niceware для парольної фрази
Генератор CSR
Генератор Hmac
Генератор JWT
Генератор PGP ключів
Генератор RSA ключів
Генератор X509 сертифікатів
Генератор ключів ECDSA
Генератор ключів Ed25519
Енкодер/декодер Bech32
Калькулятор CRC
Конвертер SSL сертифікатів
Парсер JWT
Парсер сертифікатів/ключів
Пасето/PASERK Місцевий
Пасето/ПАСЕРК Державний/Приватний
Таємний обмін Шамірами
Хешування тексту
Хешування файлів
Шифрування / дешифрування тексту
Шифрування рядків Jasypt
Шифрування файлів PGP
Шифрування/дешифрування Ansible Vault
Бінарний калькулятор
Візуалізатор тригонометричних/рівняльних кривих
Калькулятор чайових
Конвертер математичних форматів
Математичне розпізнавання символів (OCR)
Оцінювач математичних виразів
BIMI DNS Generator
CIDR IPv4/6 у діапазон IP
DKIM DNS Generator
DNS запити
IPv4-6/IPRange/CIDR у IPRange/CIDR/IPMask
SIP-авторизація
tools.restic-command-generator.name
tools.url-redirection-checker.name
Аналізатор надійності пароля
Візуальний калькулятор підмережі
Генератор Apache LogRotate
Генератор Crontab
Генератор DNS DMARC
Генератор DNS PTR
Генератор FStab
Генератор HTAccess
Генератор Htpasswd/Htaccess
Генератор IPv6 ULA
Генератор Iptables
Генератор MAC-адрес
Генератор Option43
Генератор Rsync
Генератор SPF DNS
Генератор WPA PSK
Генератор базової автентифікації
Генератор випадкових портів
Генератор команд Curl
Генератор команд UFW
Генератор команд вимкнення
Генератор командного рядка firewalld
Генератор конфігурацій Wireguard
Геолокація IP
Декодер ARPA
Декодер X-VR-SpamCause
Діапазон IPv4/6 у CIDR
Завантажувач за кількома посиланнями
Запити DNS/RDAP до Cloudflare
Калькулятор HDD
Калькулятор RAID
Калькулятор RAID-масивів ZPOOL
Калькулятор chmod
Калькулятор виключення підмереж IP
Калькулятор надійності RAID
Калькулятор підмереж IPv4
Калькулятор підмереж IPv6
Калькулятор швидкості передачі даних
Команди оболонки Лінеаризатор
Конвертер IPv4 адрес
Конвертер IPv6 адрес
Конвертер MAC-адрес
Конвертер Punycode
Лістер підмереж IPv4
Моя IP-адреса
Надійність пароля Zxcvbn
Номери портів
Перевірка DNSBL
Перевірка Whois
Пошук MAC-адреси
Пінг
Розширювач діапазону IPv4
Санітизатор HAR
Тестер WebSocket
Тестер мікрофона
Тестер портів TCP/UDP
Форматування команд оболонки
Форматувач Nginx
Цілі числа у IPv4/IPv6
Шпаргалка ZPool
CSS/JS Прикрашання та мінімізація
Json в SQL INSERT
Json до Protobuf
Json у Typescript
Генератор GitIgnore
Генератор атрибутів Git
Генератор мета-тегів Open Graph
Генератор параметрів SQL
Генератор поштових адрес
Генератор секретів Django
Генератор скриптів для навантажувального тестування K6
Генератор таблиць бази даних
Генератор фавіконок
Деобфускатор/Розпаковувач Javascript
Ескейпер рядка
Конвертер Curl
Конвертер котирувань
Конвертер файлів HEX
Конструктор рядків підключення до бази даних
Конструктор створення баз даних
Мініфікатор SQL
Обфускатор Javascript
Підсвічувач коду/скриптів
Редактор команд CLI
Роздільник файлів
Таймер Pomodoro
Тестер API
Тестер PicoMatch
Тестер втечі ANSI
Тестер інтерфейсу користувача Swagger
Фальсифікатор даних
Форматування SQL
Форматувач Javascript
Форматувач стек-трас
Інформація про код кнопки
Аналізатор звітів DMARC
Визначення типу файлу
Генератор TCPDump
Декодер EMV TLV
Декодер Safelink Outlook
Декодер посилань Sharepoint
Декодер транзакцій ETH
Детектор/декодер кодування тексту
Екстрактор Snowflake ID
Калькулятор резисторів
Конвертер GZip/Deflate
Конвертер Hex
Конвертер MIME кодування
Конвертер Middle-Endian
Конвертер MongoDB ObjectId
Конвертер SMART Raw
Конвертер чисел з плаваючою комою
Консоль послідовного порту
Конструктор URL-адрес
Конструктор команд Nmap
Маскування конфіденційних даних
Парсер Outlook MSG
Парсер URL
Парсер відмов пошти
Парсер електронної пошти
Парсер файлів cookie
Пошук властивостей ActiveDirectory LDAP
Розширювач коротких URL-адрес
Тестер DNS
Тестер HTTPS
Тестер мертвих пікселів
Тестер поширення DNS
Читач файлів Parquet
Шпаргалка з підключення RJ45 Cat6
键盘测试器
ASCII текстовий малювальник
JSON до TOON
TOON у JSON
Tab до пробілів
Вибір емодзі
Випадковий вибір рядків
Витяг тексту з HTML
Генератор Lorem ipsum
Генератор команд Sed
Генератор цитат
Генератор/Банер Zalgo
Діаграма структури папок
Експортер Mermaid
Зображення у ASCII арт
Зчитувач RSVP
Калькулятор Левенштейна
Кодер/декодер токенів GPT
Конвертер коду Морзе
Конвертер регістру
Конвертер розкладки клавіатури
Конвертер рун
Конвертер списків
Обфускація рядка
Оцінювач токенів GPT
Пакування файлів для ШІ
Перевірка I та L
Перекладач тексту
Порівнювач списків
Порівняння текстів
Порівняння шрифтів
Поширення посилань у соціальних мережах
Пошук дублікатів рядків
Розділювач AI підказок
Розумний замінник тексту
Різні слова
Статистика тексту
Текст у алфавіт НАТО
Текст у форматі Unicode
Тестер Regex
Форматувач Unicode
Юнікод до GSM-7
Epub у Markdown
HTML у Markdown
Markdown у HTML
tools.markdown-format-converter.name
Вставка як Markdown
Генератор змісту Markdown
Генератор таблиць Markdown
Знижка Lorem Ipsum
Знижка до даних
Попередній перегляд Markdown
Прикрашач таблиці Markdown
Редактор Markdown
Розцінка в текст
Різниця уцінки
Уцінка до DOCX
Конвертер енергії їжі
Конвертер об'ємної витрати
Конвертер одиниць довжини
Конвертер одиниць енергії
Конвертер одиниць кутів
Конвертер одиниць маси
Конвертер одиниць об'єму
Конвертер одиниць площі
Конвертер одиниць потужності
Конвертер одиниць сили
Конвертер одиниць тиску
Конвертер освітленості
Конвертер префіксів СІ
Конвертер прискорення
Конвертер температури
Конвертер швидкості
Перетворювач частоти
Фітнес-комп'ютер
Калькулятор амортизації
Шпаргалка Bash
Шпаргалка CSS селекторів
Шпаргалка Docker
Шпаргалка Docker SWARM
Шпаргалка Dockerfile
Шпаргалка Git
Шпаргалка JSONPath
Шпаргалка Jq
Шпаргалка Markdown
Шпаргалка Nano
Шпаргалка Nginx
Шпаргалка Powershell
Шпаргалка Regex
Шпаргалка Sed
Шпаргалка VIM
Шпаргалка XPath
Шпаргалка для K8s
Шпаргалка з екранних команд
Шпаргалка загальних регулярних виразів
Шпаргалка по Docker Compose
Шпаргалка по команді Tmux
Шпаргалка по команді Zellij
Шпаргалка по команді chmod
Шпаргалка по семантичному коміту в Git
tools.epc-qrcode-generator.name
Валідатор GTIN
Генератор QR-кодів
Генератор QR-кодів для WiFi
Генератор QR-кодів для контактної інформації
Генератор штрих-кодів
Декодер QR-кодів
Зчитувач штрих-кодів

Шпаргалка Bash

Загальні команди Bash

Bash is the default shell on most Linux systems and the language of most glue scripts. This sheet covers the interactive shortcuts, the syntax you forget between scripts, and the safety flags worth putting at the top of every file.

#!/usr/bin/env bash
set -euo pipefail

⌨️ Keyboard Shortcuts

KeysDoes
Ctrl+A / Ctrl+EJump to the start / end of the line
Ctrl+B / Ctrl+FBack / forward one character
Alt+B / Alt+FBack / forward one word
Ctrl+U / Ctrl+KCut to the start / end of the line
Ctrl+WCut the word before the cursor
Alt+DCut the word after the cursor
Ctrl+YPaste back what you last cut
Ctrl+T / Alt+TSwap the last two characters / words
Alt+.Insert the last argument of the previous command
Ctrl+LClear the screen
Ctrl+RSearch the history backwards
Ctrl+GAbort the history search
Ctrl+CInterrupt the running command
Ctrl+DEnd of input — logs out of an empty prompt
Ctrl+ZSuspend the running command
Ctrl+S / Ctrl+QFreeze / resume terminal output
Alt+U / Alt+LUpper-case / lower-case to the end of the word

🕰 History

# the last few hundred commands
history

# run command number 42
!42

# run the last command again, or the last one starting with 'ssh'
!!
!ssh

# the last argument of the previous command — also Alt+.
!$

# every argument of the previous command
!*

# re-run the last command with a substitution
^old^new

# forget a command you would rather not keep
history -d 42

# do not record commands that start with a space, and drop duplicates
export HISTCONTROL=ignoreboth
export HISTSIZE=10000 HISTFILESIZE=20000

📁 Files & Directories

# list: long, human sizes, hidden files, newest last
ls -lhAtr

# tree view of a directory
tree -L 2

# copy, move, delete
cp -r src/ dest/
mv old new
rm -rf directory

# create nested directories in one go
mkdir -p project/{src,test,docs}

# symbolic and hard links
ln -s /path/to/target linkname
ln target hardlink

# where is a file, and what is it?
find . -name '*.log' -mtime -7
find . -type f -size +100M
locate nginx.conf
which python3
type -a ls
file archive.bin
stat report.pdf

# disk usage: this directory, and the filesystem
du -sh *
du -h --max-depth=1 | sort -h
df -h

# archives
tar czf backup.tar.gz directory/
tar xzf backup.tar.gz
zip -r archive.zip directory/
unzip archive.zip

🔎 Text & Search

# grep: recursive, line numbers, case-insensitive
grep -rni "pattern" .

# only the matching part, or only the file names
grep -o 'v[0-9.]*' file
grep -rl "TODO" src/

# invert, count, context
grep -v "debug" app.log
grep -c "error" app.log
grep -B2 -A2 "exception" app.log

# head, tail, follow
head -20 file
tail -f /var/log/syslog

# columns, sorting, counting
cut -d',' -f1,3 data.csv
sort -u names.txt
sort -k2 -n scores.txt
uniq -c sorted.txt
wc -l file

# the classic: what are the top ten IPs in this log?
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

# replace across many files
sed -i 's/old/new/g' *.conf

# translate or delete characters
tr 'a-z' 'A-Z' < file
tr -d '\r' < dos.txt > unix.txt

# split a stream: to a file and onward down the pipe
command | tee output.log | grep error

# build command lines from input
find . -name '*.py' | xargs wc -l
find . -name '*.tmp' -print0 | xargs -0 rm

🖧 System & Network

# who and where am I
whoami; hostname; uname -a; uptime

# processes
ps aux | grep nginx
pgrep -a node
top
htop

# memory and load
free -h
vmstat 1 5

# what is listening, and what has this file open
ss -tulpn
lsof -i :8080
lsof /var/log/app.log

# connectivity
ping -c 4 example.com
traceroute example.com
dig example.com +short
ip addr show
curl -I https://example.com

# transfer files
scp file user@host:/path/
rsync -avz --progress src/ user@host:/dest/

# remote shell, with a tunnel
ssh user@host
ssh -L 8080:localhost:80 user@host

# services and logs (systemd)
systemctl status nginx
journalctl -u nginx -f --since "1 hour ago"

📦 Variables

# assignment: no spaces around the =
name="value"

# only for this one command
DEBUG=1 ./script.sh

# export to child processes
export PATH="$HOME/bin:$PATH"

# read input from the user
read -p "Name: " name
read -rs -p "Password: " pass

# command substitution
today=$(date +%F)

# arithmetic
count=$(( count + 1 ))
let "n = 5 * 3"

# read-only and integer variables
declare -r VERSION=1.0
declare -i counter=0
VariableHolds
$0The name of the script
$1 … $9Positional arguments
$#How many arguments were passed
$@All arguments, each one quoted separately
$*All arguments as a single word
$?Exit status of the last command
$$PID of the current shell
$!PID of the last background job
$_Last argument of the previous command
$HOME $USER $PWD $OLDPWDThe usual environment
$RANDOMA random integer
$LINENOThe current line number — handy in traps

🔤 Parameter Expansion

ExpansionResult
${var:-default}default when var is unset or empty
${var:=default}The same, and assigns it
${var:?message}Abort with message when unset — great for required arguments
${var:+value}value only when var is set
${#var}The length of the value
${var:offset:length}A substring
${var#pattern}Strip the shortest match from the start
${var##pattern}Strip the longest match from the start — ${path##*/} is basename
${var%pattern}Strip the shortest match from the end — ${file%.txt} drops the extension
${var%%pattern}Strip the longest match from the end
${var/old/new}Replace the first match
${var//old/new}Replace every match
${var^^} / ${var,,}Upper-case / lower-case the whole value
path="/var/log/app.log"
echo "${path##*/}"    # app.log
echo "${path%/*}"     # /var/log
echo "${path%.log}"   # /var/log/app

📚 Arrays

# indexed arrays
fruits=(apple banana cherry)
fruits[3]="date"

echo "${fruits[1]}"       # banana
echo "${fruits[@]}"       # every element
echo "${#fruits[@]}"      # how many elements
echo "${!fruits[@]}"      # the indexes
echo "${fruits[@]:1:2}"   # a slice

for fruit in "${fruits[@]}"; do
  echo "$fruit"
done

# associative arrays (bash 4+)
declare -A color
color[apple]="red"
color[banana]="yellow"

echo "${color[apple]}"
for key in "${!color[@]}"; do
  echo "$key is ${color[$key]}"
done

🧪 Tests & Conditions

Use [[ ... ]] in bash — it handles empty variables and patterns far better than the old [ ... ].

FilesTrue when
-e fileIt exists
-f fileIt exists and is a regular file
-d fileIt exists and is a directory
-L fileIt is a symbolic link
-s fileIt exists and is not empty
-r -w -xYou can read / write / execute it
-O fileYou own it
f1 -nt f2f1 is newer than f2 (-ot for older)
StringsTrue when
-z "$s"The string is empty
-n "$s"The string is not empty
"$a" == "$b"They are equal (= also works)
"$a" != "$b"They differ
"$a" < "$b"Sorts before, in the current locale
"$s" == pre*Glob match — unquoted right-hand side
"$s" =~ ^re$Regex match, captures land in $BASH_REMATCH
NumbersMeaning
-eqEqual
-neNot equal
-ltLess than
-leLess than or equal
-gtGreater than
-geGreater than or equal
if [[ -f "$config" && -r "$config" ]]; then
  echo "readable"
elif [[ -d "$config" ]]; then
  echo "that is a directory"
else
  echo "missing"
fi

# arithmetic comparison reads more naturally in (( ))
if (( count > 10 )); then echo "plenty"; fi

🔀 Flow Control

# for over a list, a glob, or a range
for name in alice bob; do echo "$name"; done
for f in *.log; do gzip "$f"; done
for i in {1..10}; do echo "$i"; done
for (( i = 0; i < 10; i++ )); do echo "$i"; done

# while and until
while read -r line; do echo "$line"; done < input.txt
until ping -c1 host &>/dev/null; do sleep 5; done

# case
case "$1" in
  start)   echo "starting" ;;
  stop)    echo "stopping" ;;
  restart) echo "restarting" ;;
  *)       echo "usage: $0 {start|stop|restart}"; exit 1 ;;
esac

# select builds a numbered menu
select choice in build test deploy; do
  echo "you picked $choice"
  break
done

# loop control
continue   # skip to the next iteration
break      # leave the loop

🧰 Functions

greet() {
  local name="${1:?name required}"
  local greeting="${2:-Hello}"
  echo "$greeting, $name!"
  return 0
}

greet "World"
greet "World" "Good morning"

# capture the output, and check the status
message=$(greet "World")
if ! greet; then echo "greet failed"; fi

# make a function available to subshells
export -f greet

➡️ Redirection

SyntaxDoes
> fileSend stdout to a file, replacing it
>> fileAppend stdout to a file
2> fileSend stderr to a file
2>&1Send stderr wherever stdout is going
&> fileSend both to a file (bash)
> file 2>&1The portable form of the same
< fileRead stdin from a file
<<EOF … EOFHere-document
<<-EOF … EOFHere-document, leading tabs stripped
<<< "string"Here-string
|Pipe stdout into the next command
|&Pipe stdout and stderr
> /dev/null 2>&1Discard everything
<(command)Process substitution — a command as a file
tee fileWrite to a file and pass the stream on
# a heredoc, expanded
cat <<EOF > config.ini
host=$HOSTNAME
port=8080
EOF

# a heredoc, literal (quoted delimiter)
cat <<'EOF' > script.sh
echo "$HOME is not expanded here"
EOF

# compare the output of two commands without temporary files
diff <(sort a.txt) <(sort b.txt)

⚙️ Jobs & Processes

# run in the background, and list the jobs
long_task &
jobs

# bring back to the foreground, or resume in the background
fg %1
bg %1

# Ctrl+Z suspends the foreground job

# survive logout
nohup ./script.sh > out.log 2>&1 &
disown -h %1

# wait for background jobs
wait
wait $!

# signals
kill 1234
kill -9 1234
kill -TERM %1
pkill -f "node server.js"

# give a command a deadline
timeout 30s ./slow_task.sh

# clean up on exit, whatever happens
trap 'rm -f "$tmpfile"' EXIT
trap 'echo interrupted; exit 130' INT TERM

🛡 Safe Scripting

#!/usr/bin/env bash
# -e  exit on any failing command
# -u  treat unset variables as an error
# -o pipefail  a pipeline fails if any stage fails
set -euo pipefail

# make word splitting predictable
IFS=$'\n\t'

# always quote expansions
cp "$src" "$dest"

# check the syntax without running anything
bash -n script.sh

# trace every command as it runs
bash -x script.sh
set -x; risky_command; set +x

# a more informative trace prefix
export PS4='+ ${BASH_SOURCE}:${LINENO}: '

# report where a script died
trap 'echo "failed at line $LINENO with status $?" >&2' ERR

# and lint it before it reaches anyone else
shellcheck script.sh

⚠️ set -e has surprising corners: it does not fire inside if, &&, || or command substitutions used in assignments. It is a seatbelt, not autopilot — still check what matters explicitly.

🎨 Colours

Escape sequences take the form \033[<style>;<colour>m, and \033[0m resets. \e and \x1B are the same character as \033.

ColourForegroundBrightBackground
Black309040
Red319141
Green329242
Yellow339343
Blue349444
Magenta359545
Cyan369646
White379747
StyleCodeStyleCode
Reset0Underline4
Bold1Blink5
Dim2Reverse7
RED='\033[0;31m'
GREEN='\033[0;32m'
BOLD='\033[1m'
RESET='\033[0m'

echo -e "${GREEN}ok${RESET} — ${RED}${BOLD}failed${RESET}"

# only colourise when stdout is a terminal
if [[ -t 1 ]]; then RED='\033[0;31m'; RESET='\033[0m'; else RED=''; RESET=''; fi

💡 Tips

# aliases and functions belong in ~/.bashrc
alias ll='ls -lhA'
alias gs='git status -sb'
mkcd() { mkdir -p "$1" && cd "$1"; }

# reload the config after editing it
source ~/.bashrc

# brace expansion saves a lot of typing
cp config.yaml{,.bak}
mkdir -p src/{components,utils,tests}

# repeat the previous command as root
sudo !!

# go back to the previous directory
cd -

# run something regardless of the current directory
(cd /tmp && ./task.sh)

# time a command, and keep a transcript of a session
time ./build.sh
script session.log

📚 Resources

  • GNU Bash manual
  • ShellCheck — lints your scripts
  • Bash Pitfalls
  • Google Shell Style Guide
  • explainshell — break down any command line