Tool.Yun
Uirlisí úsáideacha do fhorbróirí
Áireamhán Amúchta
Bileog Cheat Bash
Bileog Cheat Comhréire JSONPath
Bileog Cheat Comhréire XPath
Bileog Cheat Docker
Bileog Cheat Jq
Bileog Cheat K8s
Bileog Cheat Markdown
Bileog Cheat Nano
Bileog Cheat Ordú Scáileáin
Bileog Cheat Ordú Tmux
Bileog Cheat Ordú Zellij
Bileog Cheat Ordú chmod
Bileog Cheat Powershell
Bileog Cheat Regex Choitianta
Bileog Cheat Roghnóirí CSS
Bileog Cheat Tiomnais Seimeantach Git
Bileog Cheat VIM
Bileog caimiléir Git
Bileog cheat Docker Compose
Bileog cheat Docker SWARM
Bileog cheat Dockerfile
Bileog cheat Regex
Bileog cheat Sed
NBileog Cheat ginx
Flipper Bonn
Roghnóir Cártaí
Rollóir Dísle
Roth an fhortún
Argon2 Hasher
Bcrypt
Beart Niceware go Frása Pasfhocail
Cripteagrafaíocht AOIS
Criptigh / díchriptiú téacs
Criptithe cruinneachán Ansible a dhíchriptiú
Criptiú Comhaid PGP
Criptiú PGP
Criptiú RSA
Criptiú Teaghrán Jasypt
Eochairghiniúint PGP
Gineadóir CSR
Gineadóir JWT
Gineadóir péire eochracha Ed25519
Gineadóir péirí eochracha ECDSA
Gineadóir teastais X509
Hais Comhaid
Hais téacs
Hmac gineadóir
Ionchódóir/Díchódóir Bech32
Parsálaí JWT
Parsálaí SAML
Parsálaí Teastais/Eochrach
Paseto/PASERK Poiblí/Príobháideach
Paseto/PASERK Áitiúil
RSA gineadóir eochair péire
Roinnt Rúnda Shamirs
Sínitheoir agus Fíoraitheoir RSA/DSA/ECDSA
Tiontaire Teastais SSL
Áireamhán CRC
Bailíochtóir GTIN
Díchódóir Cód QR
Gineadóir Faisnéise Teagmhála QR
Gineadóir barrachóid
Gineadóir cóid QR
Gineadóir cóid QR WiFi
Léitheoir Barrachóid
tools.epc-qrcode-generator.name
Bailíochtóir Cumadóireachta Docker
Docker Compose chuig comhad .env
Docker Compose go Quadlets
Docker compose go kubernetes
Docker iniúchta le haghaidh rith Docker
Déantóir Cumadóireachta Docker Traefik
Gineadóir Lipéad Dockerfile
Gineadóir RBAC Kubernetes
Lipéid Docker Pangolin
Rith Docker go Kubernetes
Rith Docker go Quadlets
Rith docker chuig tiontaire cumadóireachta Docker
Tiontaire Formáide Docker Compose
Tiontaire rith Docker Compose go Docker
Íoslódálaí Íomhánna Docker
Aláram Ama
Aláram Cron/Laethanta na Seachtaine
Comhaireamh síos
Cróniméadar
Cumaisc iCal
Cén Lá?
Gineadóir ICAL
Parsálaí Comhad ICAL
Tiontaire Crios Ama
Tiontaire Uimhreacha Seachtaine
Tiontaire dáta-am
Áireamhán Dáta+Fad
Áireamhán ETA
Áireamhán Fad
Áireamhán Laethanta
Áireamhán TTL
Ríomhaire Aclaíochta
Tiontaire Aonaid Achar
Tiontaire Aonaid Brú
Tiontaire Aonaid Fad
Tiontaire Aonaid Fuinnimh
Tiontaire Aonaid Fórsa
Tiontaire Aonaid Mais
Tiontaire Aonaid Toirte
Tiontaire Aonaid Uillinne
Tiontaire Cumhachta
Tiontaire Fuinnimh Bia
Tiontaire Luas
Tiontaire Luasghéaraithe
Tiontaire Minicíochta
Tiontaire Ráta Sreafa Toirte
Tiontaire Réimíreanna SI
Tiontaire Soilsiúcháin
Tiontaire teochta
Aibhsitheoir Cód/Scripteanna
Amaire Pomodoro
Bréigeoir Sonraí
CSS/JS Áilleachtú & Laghdaigh
Ceo Javascript
Dí-chomhbhrúiteoir/Díphacáileoir Javascript
Eagarthóir orduithe Cli
Gineadóir Favicon
Gineadóir GitIgnore
Gineadóir Mailto
Gineadóir Paraiméadair SQL
Gineadóir Rúnda Django
Gineadóir Scripteanna Tástála Ualaigh K6
Gineadóir Tréithe Git
Gineadóir Tábla Bunachar Sonraí
Json go Protobuf
Json go SQL INSERT
Json go Typescript
Miniféir SQL
Oscail gineadóir meta graf
SQL prettify agus formáid
Scoilteoir Comhad
Stacktrace níos deise
Tiontaire Comhad HEX
Tiontaire Lua
Tiontaire Lúb
Tástálaí API
Tástálaí Chomhéadain Swagger
Tástálaí Picomatch
Tástálaí Éalaithe ANSI
Tógálaí Cruthaithe Bunachar Sonraí
Tógálaí Teaghrán Ceangail Bunachar Sonraí
Áillitheoir Javascript
Éalaitheoir Teaghrán
Anailíseoir Tuairiscí DMARC
Bileog Cheat Sreangaithe RJ45 Cat6
Brathadóir Cineál Comhaid
Brathadóir/Díchódóir Tacair Charachtair Téacs
Consól Port Sraitheach
Cuardaitheoir airíonna LDAP ActiveDirectory
Díchódóir EMV TLV
Díchódóir Idirbhirt ETH
Díchódóir Safelink Outlook
Díchódóir Url Comhroinnte SharePoint
Eastóscóir aitheantais calóga sneachta
Faisnéis eochairchóid
Gineadóir TCPDump
Ionchódóir/Díchódóir Heicsidheachúlach
Leathnaitheoir URLanna Gearra
Léitheoir comhaid Parquet
Mascóir sonraí íogaire
Parsálaí Fianán
Parsálaí MSG Outlook
Parsálaí Ríomhphoist
Parsálaí Ríomhphoist Preabtha
Parsálaí URL
Tiontaire GZip/Díbhoilscithe
Tiontaire IdRéadaí MongoDB
Tiontaire Ionchódaithe MIME
Tiontaire Meán-Endian
Tiontaire SMART Raw
Tiontaire uimhir snámhphointe
Tástálaí DNS
Tástálaí HTTPS
Tástálaí Ilphlandúcháin DNS
Tástálaí Picteil Marbh
Tógálaí Ordú Nmap
Tógálaí URL
Áireamhán Friotóra
键盘测试器
Gineadóir Cód PIN
Gineadóir Frása Pas
Gineadóir NanoIDanna
Gineadóir Pasfhocal Diceware
Gineadóir UUIDs
Gineadóir comhartha
Gineadóir cóid OTP saor in aisce,
Gineadóir pasfhrása BIP39
Gineadóir uimhreacha
Gineadóir uimhreacha randamacha
Tiontaire UUID
Cineálacha MIME
Cóid stádais HTTP
Déantóir Blúirí Cuardaigh Téacs Url
Eagarthóir HTML WYSIWYG
Eolas gléas
Gabhálaí Url
Gineadóir Grádáin CSS
Gineadóir URL UTM
Gineadóir áitsealbhóirí SVG
Glantóir Html
Glantóir URL
HTML go XHTML
HTML go sonraí
Ionchódaigh/díchódaigh teaghráin formáidithe URL
Laghdaitheoir HTML
Parsálaí úsáideora-ghníomhaire
Roth Dathanna
Seiceálaí Codarsnachta Datha
Slabhra sluga a chruthú
Tiontaire Aonad CSS
Tiontaire CSS XPath
Tiontaire datha
Tiontaire picteilín REM
Áillitheoir CSS
Áillitheoir Html
Éalú aonáin HTML
Íomhá go CSS
Anailíseoir Méid Json
CSV go JSON
Cumaisc JSON
Cód Json go PHP
Difríocht JSON
Eagarthóir JSON
Iarratas Json
JSON Leacaitheoir/Díleacaitheoir
JSON Linter
JSON ceartaigh agus formáid
JSON chuig an Eintiteas Java
JSON go .env
JSON go C#
JSON go CSV
JSON go Go
JSON go MessagePack
JSON go Sonraí
JSON go TOML
JSON go TS
JSON go XML
JSON go réad
Json go PHP-Array
Json go Python
Json go SQL DDL
Json go Scéim
Laghdaigh JSON
Máistir sórtála JSON
ObjGen go JSON
PHP-Eagar go JSON
Pacáiste Teachtaireachta chuig JSON
Tiontaire JS go JSON
Tiontaire JSON go JS
Tiontaire JSON go YAML
Tiontaire teaghrán Json
Tástálaí Jq/JSONPath
tools.json-patch.name
Éalú Json/Unescape
Anailíseoir neart pasfhocal
Bileog Cheat ZPool
Cuardach seoladh MAC
Díchódóir ARPA
Díchódóir X-VR-SpamCause
Fiosrúcháin DNS
Forbróir raon IPv4
Formáideoir Nginx
Formáideoir Orduithe Shell
Geoshuíomh IP
Gineadóir Crontab
Gineadóir Cumraíochta Wireguard
Gineadóir DMARC DNS
Gineadóir DNS BIMI
Gineadóir DNS DKIM
Gineadóir DNS PTR
Gineadóir DNS SPF
Gineadóir FStab
Gineadóir HTAccess
Gineadóir Htpasswd/htaccess
Gineadóir Iptables
Gineadóir LogRotate Apache
Gineadóir Option43
Gineadóir Orduithe Múchta
Gineadóir Ordú Curl
Gineadóir Ordú UFW
Gineadóir Rsync
Gineadóir WPA PSK
Gineadóir port randamach
Gineadóir seoladh MAC
Gineadóir údaraithe bunúsach
IPv4-6/IPRange/CIDR in IPRange/CIDR/IPMask
IPv6 gineadóir ULA
Iarratais DNS/RDAP Cloudflare
Liosta Fo-líonra IPv4
Línearaitheoir Orduithe Shell
Mo Sheoladh IP
Neart Pasfhocal Zxcvbn
Ping
Seiceálaí DNSBL
Seiceálaí Whois
Sláintitheoir HAR
Slánuimhreacha chuig IPv4/IPv6
Tiontaire Punycode
Tiontaire Seoladh MAC
Tiontaire seoladh IPv4
Tiontaire seoladh Ipv6
Tástálaí Calafoirt TCP/UDP
Tástálaí Micreafóin
Tástálaí soicéad gréasáin
Uimhreacha Poirt
gineadóir líne ordaithe firewalld
tools.restic-command-generator.name
tools.url-redirection-checker.name
Áireamhán Chmod
Áireamhán Eisiaimh Fo-líonraí IP
Áireamhán Fo-líonra Amhairc
Áireamhán HDD
Áireamhán Iontaofachta RAID
Áireamhán RAID
Áireamhán RAID ZPOOL
Áireamhán Raoin IP ó CIDR Ipv4/6
Áireamhán Raon IPv4/6 go CIDR(anna)
Áireamhán Ráta Aistrithe Sonraí
Áireamhán fo-líonra Ipv6
Áireamhán subnet IPv4
Íoslódálaí il-naisc
Údarú SIP
Difríocht Marcáil anuas
Eagarthóir Markdown
Epub go Markdown
Gineadóir Tábla Marcála
Gineadóir toc Markdown
Greamaigh mar Markdown
HTML le marcáil síos
Lorem Ipsum Markdown
Marcáil síos ar shonraí
Marcáil síos go DOCX
Marcáil síos go HTML
Marcáil síos go Téacs
Réamhamharc marcála síos
tools.markdown-format-converter.name
Áilleoir Tábla Marcála
Amharcléiritheoir Cuar Triantánach/Cothromóideach
Measúnaí mata
OCR Matamaitice
Tiontaire Formáidí Matamaitice
Áireamhán Dénártha
Áireamhán leideanna
Comhbhrúiteoir PDF
Comhcheanglóir Pdf
Eastóscóir Téacs PDF
HTML go PDF
Pdf Criptithe
Pdf Eastóscóir Leathanach
Pdf Línearú/FastWeb
Pdf a dhíchriptiú agus a dhíghlasáil
Seiceáil sínithe PDF
Tógálaí Léirithe Cron
Bailíochtóir Luhn
Bailíochtóir agus Parsálaí ISBN
Bailíochtóir agus parsálaí IBAN
Bailíochtú Uimhreacha CBL
Comhoiriúnacht ceadúnas bogearraí
Cuardach Unicode
Cuardaitheoir Cód Tíre ISO 3166
Cuardaitheoir ISO 639
Foclóir Ar Líne
Mínigh an tOrdú Shell
Parsálaí agus formáidí fón
Seiceálaí Cárta Creidmheasa
Tiontaire Airgeadra
Tiontaire Cás Uachtarach RMB
Tiontaire Féilire
Treoirlínte Soilsithe IES
Áireamhán BMI
Áireamhán Luas Rith
Áireamhán SLA
TOML Linter
TOML go JSON
TOML go YAML
Csv go Sonraí
Excel go sonraí
Gineadóir ULID
Ionchódóir/díchódóir eagar heicsidheachúlach Base64
Ionchódóir/díchódóir teaghrán Base64
Normalaitheoir ríomhphoist
Ríomhaire Ídiú Fuinnimh agus Costais
Tiontaire Aonad Go Leor
Tiontaire Aonaid Stórála Sonraí
Tiontaire Carachtair Unicode go Eintitis Java
Tiontaire Comhordanáidí Geografacha
Tiontaire Formáid Athróg Comhdhlútha
Tiontaire airíonna
Tiontaire bonn slánuimhir
Tiontaire comhad base64 íoslódáil
Tiontaire dBm mW
Tiontaire uimhreacha Rómhánacha
Torrent go Maighnéad
Téacs go Unicode
Téacs go dénártha UTF-8
Tógálaí tagarmhairc
Áireamhán Cóimheas Gnéithe
Áireamhán achair gheografaigh
Áireamhán céatadánach
Aimsitheoir Línte Dúblacha
Aistritheoir Téacs
Athsholáthar Téacs Cliste agus Briseadh Líne
Bain téacs as HTML
Comhroinnteoir Nasc Sóisialta
Comparadóir Liostaí
Difríocht téacs
Déan Comparáid Clónna
Focail Ar Leith
Formáideoir Unicode
Gineadóir Ordú Sed
Gineadóir Sleachta
Gineadóir Téacs Ealaíne ASCII
Gineadóir an-mhaith
Gineadóir/Meirge Zalgo
Ionchódóir/Díchódóir Comhartha GPT
JSON go TOON
Liosta tiontaire
Léaráid Struchtúr Fillteán
Léitheoir RSVP
Meastóir Comharthaí GPT
Onnmhaireoir maighdeana mara
Pacáil comhaid le haghaidh AI
Roghnóir Emoji
Roghnóir Líní Rándamach
Scoilteoir Pras AI
Scrambalóir slabhra
Seiceálaí I agus L
Staitisticí téacs
TOON go JSON
Tabáil go Spásanna
Tiontaire Cód Morse
Tiontaire Leagan Amach Méarchláir
Tiontaire Rún
Tiontaire cás
Tástálaí Regex
Téacs chuig Ainmneacha Unicode
Téacs go aibítir NATO
Unicode go GSM-7
Áireamhán Levenshtein
Íomhá go hEalaín ASCII
Formáidiú XML
Linter XML
ObjGen go HTML
Tástálaí XPath
Tástálaí XSLT
XML go JSON
Cumasc YAML
Tiontaire YAML go JSON
YAML Leacaitheoir/Díleacaitheoir
YAML go TOML
YAML prettify agus formáid
Athraitheoir íomhá
Bain Cúlra na hÍomhá
Bain EXIF
Comparáid Íomhá
GIF go MP4
Inbhéartóir Dath Íomhá
Léitheoir cáilíochta EXIF/Meiteashonraí/GPS/JPEG íomhá
OCRúigh íomhá agus PDF
Réamhamharcóir SVG
Ríomhairigh íomhá
Taifeadta ceamara
Tiontaire Formáidí Íomhá
Tiontaire HEIC
Tiontaire ICO/PNG
Uiscemharc
Íomhá go SVG (potrace)

Bileog Cheat Bash

Orduithe coitianta 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