Tool.Yun
Χρήσιμα εργαλεία για προγραμματιστές
CSV σε JSON από αρχεία CSV σε JSON
JSON Flattener/Unflattener
JSON Linter
JSON για να αντιταχθεί
JSON για χρήση
JSON ελαχιστοποίηση
JSON σε .env
JSON σε C#
JSON σε CSV
JSON σε MessagePack
JSON σε TOML
JSON σε TS
JSON σε XML
JSON σε δεδομένα
JSON σε οντότητα Java
Json Escaper/Unescaper
Json σε PHP-Array
Json σε Python
Json σε SQL DDL
Json σε Σχήμα
ObjGen σε JSON
PHP-Array σε JSON
tools.json-patch.name
Αναλυτής μεγέθους Json
Διαφορά JSON
Δοκιμαστής Jq/JSONPath
Επεξεργαστής JSON
Ερώτημα Json
Κύριος ταξινόμηση JSON
Κώδικας Json σε PHP
Μετατροπέας JS σε JSON
Μετατροπέας JSON σε JS
Μετατροπέας JSON σε YAML
Μετατροπέας συμβολοσειρών Json
Ομορφοποίηση και μορφοποίηση JSON
Πακέτο μηνυμάτων σε JSON
Συγχώνευση JSON
HTML σε PDF
Έλεγχος υπογραφών PDF
Αποκρυπτογράφηση και ξεκλείδωμα PDF
Γραμμικοποίηση PDF/FastWeb
Εξαγωγέας κειμένου PDF
Εξαγωγέας σελίδων PDF
Κρυπτογράφηση PDF
Συμπιεστής PDF
Συνδετήρας PDF
ObjGen σε HTML
XML Linter
XML σε JSON
Δοκιμαστής XSLT
Ελεγκτής XPath
Μορφοποιητής XML
YAML Flattener/Unflattener
YAML σε TOML
Μετατροπέας YAML σε JSON
Ομορφοποίηση και μορφοποίηση YAML
Συγχώνευση YAML
Εργαλείο δημιουργίας εκφράσεων Cron
CSS/JS Prettify & Minify
Json προς Protobuf
Json σε Typescript
SQL Minifier
Stacktrace πιο όμορφο
Άνοιγμα γεννήτριας μεταδεδομένων γραφημάτων
Αποκρυπτογράφος Javascript
Αποσυμπιεστής/Αποσυσκευαστής Javascript
Γεννήτρια Favicon
Γεννήτρια GitIgnore
Γεννήτρια αλληλογραφίας
Γεννήτρια μυστικών Django
Γεννήτρια παραμέτρων SQL
Γεννήτρια πινάκων βάσης δεδομένων
Γεννήτρια σεναρίων δοκιμής φόρτωσης K6
Γεννήτρια χαρακτηριστικών Gitat
Δημιουργός δημιουργίας βάσεων δεδομένων
Διαφυγέας χορδών
Διαχωριστής αρχείων
Δοκιμές API
Δοκιμαστής Picomatch
Δοκιμαστής UI Swagger
Δοκιμαστής διαφυγής ANSI
Εισαγωγή από Json σε SQL
Επεξεργαστής εντολών Cli
Επισήμανση κώδικα/σεναρίων
Εργαλείο δημιουργίας συμβολοσειρών σύνδεσης βάσης δεδομένων
Μετατροπέας Προσφορών
Μετατροπέας αρχείων HEX
Μετατροπέας μπούκλας
Ομορφοποίηση και μορφοποίηση SQL
Παραποιητής Δεδομένων
Προγραμματιστής Javascript
Χρονοδιακόπτης Pomodoro
Γεννήτρια NanoIDs
Γεννήτρια UUID
Γεννήτρια Ταχυδρομικού Κώδικα
Γεννήτρια αριθμητικών ονομάτων
Γεννήτρια διακριτικών
Γεννήτρια κωδικών OTP
Γεννήτρια κωδικών πρόσβασης
Γεννήτρια κωδικών πρόσβασης BIP39
Γεννήτρια κωδικών πρόσβασης Diceware
Γεννήτρια τυχαίων αριθμών
Μετατροπέας UUID
tools.epc-qrcode-generator.name
Αναγνώστης γραμμωτού κώδικα
Αποκωδικοποιητής κωδικών QR
Γεννήτρια γραμμωτού κώδικα
Γεννήτρια κωδικών QR
Γεννήτρια κωδικών QR WiFi
Γεννήτρια πληροφοριών επικοινωνίας QR
Επικυρωτής GTIN
IPv4-6/IPRange/CIDR σε IPRange/CIDR/IPMask
tools.restic-command-generator.name
tools.url-redirection-checker.name
Έλεγχος DNSBL
Έλεγχος Whois
Ακέραιοι αριθμοί σε IPv4/IPv6
Αναζήτηση διεύθυνσης MAC
Αναλυτής ισχύος κωδικού πρόσβασης
Αποκωδικοποιητής ARPA
Αποκωδικοποιητής X-VR-SpamCause
Απολυμαντικό HAS
Αριθμοί θυρών
Αριθμομηχανή Chmod
Αριθμομηχανή σκληρού δίσκου
Βασική γεννήτρια εξουσιοδότησης
Γεννήτρια Apache LogRotate
Γεννήτρια Crontab
Γεννήτρια DNS BIMI
Γεννήτρια DNS DKIM
Γεννήτρια DNS DMARC
Γεννήτρια DNS PTR
Γεννήτρια FStab
Γεννήτρια HTAccess
Γεννήτρια Htpasswd/htaccess
Γεννήτρια IPv6 ULA
Γεννήτρια Iptables
Γεννήτρια Option43
Γεννήτρια Rsync
Γεννήτρια SPF DNS
Γεννήτρια WPA PSK
Γεννήτρια διευθύνσεων MAC
Γεννήτρια εντολών Curl
Γεννήτρια εντολών UFW
Γεννήτρια εντολών τερματισμού λειτουργίας
Γεννήτρια ρυθμίσεων Wireguard
Γεννήτρια τυχαίων θυρών
Γεωγραφική τοποθεσία IP
Γραμμικοποιητής εντολών κελύφους
Δοκιμή Websocket
Δοκιμαστής θύρας TCP/UDP
Δοκιμαστής μικροφώνου
Εξουσιοδότηση SIP
Επεκτατήρας εύρους IPv4
Ερωτήματα DNS
Ερωτήματα DNS/RDAP του Cloudflare
Η διεύθυνση IP μου
Ισχύς κωδικού πρόσβασης Zxcvbn
Λήψη πολλαπλών συνδέσμων
Λίστα υποδικτύων IPv4
Μετατροπέας Punycode
Μετατροπέας διευθύνσεων IPv4
Μετατροπέας διευθύνσεων IPv6
Μετατροπέας διευθύνσεων MAC
Μορφοποιητής Nginx
Μορφοποιητής εντολών κελύφους
Πινγκ
Υπολογιστής RAID
Υπολογιστής ZPOOL RAID
Υπολογιστής αξιοπιστίας RAID
Υπολογιστής εξαίρεσης υποδικτύων IP
Υπολογιστής εύρους IPv4/6 CIDR σε IP
Υπολογιστής εύρους IPv4/6 έως CIDR(s)
Υπολογιστής οπτικού υποδικτύου
Υπολογιστής ρυθμού μεταφοράς δεδομένων
Υπολογιστής υποδικτύου IPv4
Υπολογιστής υποδικτύου IPv6
Φύλλο οδηγιών χρήσης ZPool
γεννήτρια γραμμής εντολών firewalld
Έλεγχος πιστωτικών καρτών
Αναζήτηση ISO 639
Αναζήτηση Unicode
Αναζήτηση κωδικών χωρών ISO 3166
Αναλυτής και μορφοποιητής τηλεφώνου
Εξηγήστε την εντολή Shell
Επικυρωτής Luhn
Επικυρωτής Αριθμών ΦΠΑ
Επικυρωτής και αναλυτής IBAN
Επικυρωτής και αναλυτής ISBN
Ηλεκτρονικό Λεξικό
Μετατροπέας Κεφαλαίων RMB
Μετατροπέας ημερολογίου
Μετατροπέας νομισμάτων
Οδηγίες φωτισμού IES
Συμβατότητα με άδειες χρήσης λογισμικού
Υπολογιστής SLA
Υπολογιστής ΔΜΣ
Υπολογιστής Ρυθμού Τρεξίματος
Αναζήτηση ιδιοτήτων ActiveDirectory LDAP
Αναλυτής Cookies
Αναλυτής MSG του Outlook
Αναλυτής URL
Αναλυτής αναπήδησης email
Αναλυτής αναφορών DMARC
Αναλυτής ηλεκτρονικού ταχυδρομείου
Ανιχνευτής τύπου αρχείου
Ανιχνευτής/Αποκωδικοποιητής συνόλου χαρακτήρων κειμένου
Αποκρυπτογράφος ευαίσθητων δεδομένων
Αποκωδικοποιητής EMV TLV
Αποκωδικοποιητής Safelink του Outlook
Αποκωδικοποιητής URL κοινής χρήσης SharePoint
Αποκωδικοποιητής συναλλαγών ETH
Αρχεία παρκέ Reader
Γεννήτρια TCPDump
Δεκαεξαδικός κωδικοποιητής/αποκωδικοποιητής
Δημιουργός URL
Δημιουργός εντολών Nmap
Δοκιμαστής DNS
Δοκιμαστής HTTPS
Δοκιμαστής διάδοσης DNS
Δοκιμαστής νεκρών εικονοστοιχείων
Εξολκέας ταυτότητας Snowflake
Επεκτατήρας σύντομων URL
Κονσόλα σειριακής θύρας
Μετατροπέας GZip/Deflate
Μετατροπέας Middle-End
Μετατροπέας ObjectId MongoDB
Μετατροπέας SMART Raw
Μετατροπέας αριθμών κινητής υποδιαστολής
Μετατροπέας κωδικοποίησης MIME
Πληροφορίες κωδικού πρόσβασης
Υπολογιστής αντίστασης
Φυλλάδιο με οδηγίες για την καλωδίωση RJ45 Cat6
键盘测试器
GIF σε MP4
OCR εικόνας και PDF
Αλλαγή μεγέθους εικόνας
Αναγνώστης εικόνας EXIF/Μεταδεδομένα/GPS/JPEG ποιότητας
Αφαίρεση EXIF
Αφαίρεση φόντου εικόνας
Εικόνα σε SVG (προβολή εικόνας)
Κάμερα εγγραφής
Μετατροπέας HEIC
Μετατροπέας ICO/PNG
Μετατροπέας μορφών εικόνας
Μετατροπέας χρώματος εικόνας
Περικοπή εικόνας
Προεπισκόπηση SVG
Σύγκριση εικόνων
Υδατόσημο
Αναλυτής αρχείων ICAL
Αντίστροφη μέτρηση
Γεννήτρια ICAL
Μετατροπέας αριθμών εβδομάδων
Μετατροπέας ζώνης ώρας
Μετατροπέας ημερομηνίας-ώρας
Ξυπνητήρι ώρας
Ποια μέρα;
Συγχώνευση iCal
Συναγερμός Cron/Εβδομαδιαίας Ημέρας
Υπολογιστής ETA
Υπολογιστής TTL
Υπολογιστής Διάρκειας
Υπολογιστής Ημερομηνίας+Διάρκειας
Υπολογιστής ημερών
Χρονόμετρο
HTML Prettifier
HTML ελαχιστοποιητής
HTML σε XHTML
HTML σε δεδομένα
Έλεγχος αντίθεσης χρωμάτων
Αναλυτής παράγοντα χρήστη
Βελτιωτής CSS
Γεννήτρια URL UTM
Γεννήτρια placeholder SVG
Γεννήτρια διαβάθμισης CSS
Δημιουργός τμημάτων αναζήτησης κειμένου URL
Εικόνα σε CSS
Επεξεργαστής HTML WYSIWYG
Καθαριστικό HTML
Καθαριστικό URL
Καταγραφή URL
Κωδικοί κατάστασης HTTP
Κωδικοποίηση/αποκωδικοποίηση συμβολοσειρών με μορφοποίηση URL
Μετατροπέας CSS XPath
Μετατροπέας εικονοστοιχείων REM
Μετατροπέας μονάδων CSS
Μετατροπέας χρωμάτων
Οντότητες HTML διαφυγής
Πληροφορίες συσκευής
Συμβολοσειρά Slugify
Τροχός Χρωμάτων
Τύποι MIME
I και L Checker
JSON σε TOON
TOON σε JSON
Tab σε κενά διαστήματα
Unicode σε GSM-7
Έξυπνη αντικατάσταση κειμένου και αλλαγή γραμμής
Αναγνώστης RSVP
Αποκρυπτογράφος συμβολοσειρών
Γεια σου, γεννήτρια.
Γεννήτρια εντολών Sed
Γεννήτρια κειμένου τέχνης ASCII
Γεννήτρια παραπομπών
Γεννήτρια/Banner Zalgo
Διάγραμμα δομής φακέλου
Διαφορά κειμένου
Διαχωριστής προτροπών AI
Δοκιμαστής Regex
Εικόνα σε ASCII Art
Εκτιμητής διακριτικών GPT
Εξαγωγέας γοργόνας
Εξαγωγή κειμένου από HTML
Επιλογέας emoji
Επιλογέας Τυχαίων Γραμμών
Εύρεση διπλότυπων γραμμών
Κείμενο στο αλφάβητο του ΝΑΤΟ
Κοινή χρήση συνδέσμων κοινωνικής δικτύωσης
Κωδικοποιητής/Αποκωδικοποιητής διακριτικών GPT
Μετατροπέας διάταξης πληκτρολογίου
Μετατροπέας κώδικα Μορς
Μετατροπέας λίστας
Μετατροπέας πεζών-κεφαλαίων
Μετατροπέας ρούνων
Μεταφραστής κειμένου
Μορφοποιητής Unicode
Ξεχωριστές λέξεις
Ονόματα κειμένου σε Unicode
Στατιστικά κειμένου
Συσκευασία αρχείων για AI
Σύγκριση γραμματοσειρών
Σύγκριση λιστών
Υπολογιστής Levenshtein
Argon2 Hasher
Bcrypt
Niceware Bytes σε Passphrase
PGP keygen
Paseto/PASERK Δημόσιο/Ιδιωτικό
Paseto/PASERK Τοπικό
Αναλυτής JWT
Αναλυτής SAML
Αναλυτής πιστοποιητικών/κλειδιών
Αποκρυπτογράφηση κρυπτογράφησης θησαυροφυλάκιου Ansible
Αρχείο Hasher
Γεννήτρια Hmac
Γεννήτρια JWT
Γεννήτρια ΕΚΕ
Γεννήτρια ζεύγους κλειδιών ECDSA
Γεννήτρια ζεύγους κλειδιών Ed25519
Γεννήτρια ζεύγους κλειδιών RSA
Γεννήτρια πιστοποιητικών X509
Κείμενο κατακερματισμού
Κρυπτογράφηση / αποκρυπτογράφηση κειμένου
Κρυπτογράφηση PGP
Κρυπτογράφηση RSA
Κρυπτογράφηση αρχείων PGP
Κρυπτογράφηση συμβολοσειρών Jasypt
Κρυπτογραφία AGE
Κωδικοποιητής/Αποκωδικοποιητής Bech32
Μετατροπέας πιστοποιητικών SSL
Μυστική Κοινοποίηση του Shamir
Υπογράφων και Επαληθευτών RSA/DSA/ECDSA
Υπολογιστής CRC
Docker Compose σε Quadlets
Docker επιθεώρηση για εκτέλεση Docker
Γεννήτρια RBAC Kubernetes
Γεννήτρια ετικετών Dockerfile
Δημιουργός σύνθεσης Traefik Docker
Εκτέλεση Docker σε Quadlets
Επικυρωτής Docker Compose
Ετικέτες Docker Pangolin
Λήψη εικόνων Docker
Μετατροπέας Docker Compose σε Docker run
Μετατροπέας Docker που εκτελείται σε Docker compose
Μετατροπέας μορφής Docker Compose
Σύνθεση Docker σε kubernetes
Σύνταξη Docker σε αρχείο .env
Το Docker εκτελείται στο kubernetes
Δημιουργός σημείων αναφοράς
Υπολογιστής αναλογίας διαστάσεων
Υπολογιστής γεωγραφικής απόστασης
Υπολογιστής ποσοστού
Αξιολογητής μαθηματικών
Δυαδική Αριθμομηχανή
Μαθηματικά OCR
Μετατροπέας Μαθηματικών Μορφών
Οπτικοποιητής Τριγωνομετρικών/Εξισώσεων Καμπυλών
Υπολογιστής φιλοδωρήματος
CSV σε δεδομένα
Excel σε δεδομένα
Torrent σε Magnet
Γεννήτρια ULID
Κανονικοποιητής ηλεκτρονικού ταχυδρομείου
Κείμενο σε Unicode
Κείμενο σε δυαδικό UTF-8
Κωδικοποιητής/αποκωδικοποιητής δεκαεξαδικού πίνακα Base64
Κωδικοποιητής/αποκωδικοποιητής συμβολοσειρών Base64
Μετατροπέας dBm mW
Μετατροπέας Γεωγραφικών Συντεταγμένων
Μετατροπέας αρχείων Base64
Μετατροπέας βάσης ακεραίων αριθμών
Μετατροπέας ιδιοτήτων
Μετατροπέας μονάδων αποθήκευσης δεδομένων
Μετατροπέας μορφής μεταβλητών περιβάλλοντος
Μετατροπέας πολλών μονάδων
Μετατροπέας ρωμαϊκών αριθμών
Μετατροπέας χαρακτήρων Unicode σε οντότητες Java
Υπολογιστής Κατανάλωσης και Εξόδων Ενέργειας
Υπολογιστής Απόσβεσης
Αναποδογυριστής κερμάτων
Επιλογέας καρτών
Ρόλερ ζαριών
Τροχός της τύχης
TOML Linter
TOML σε JSON
TOML σε YAML
Μετατροπέας Ενέργειας Τροφίμων
Μετατροπέας Μονάδων Δύναμης
Μετατροπέας Μονάδων Εμβαδού
Μετατροπέας Μονάδων Ενέργειας
Μετατροπέας Μονάδων Μάζας
Μετατροπέας Φωτισμού
Μετατροπέας επιτάχυνσης
Μετατροπέας θερμοκρασίας
Μετατροπέας ισχύος
Μετατροπέας μονάδων γωνίας
Μετατροπέας μονάδων μήκους
Μετατροπέας μονάδων πίεσης
Μετατροπέας μονάδων όγκου
Μετατροπέας προθεμάτων SI
Μετατροπέας ρυθμού ροής όγκου
Μετατροπέας συχνότητας
Μετατροπέας ταχύτητας
Υπολογιστής γυμναστικής
Docker Cheatsheet
Git cheatsheet
Jq Cheatsheet
Κοινό Regex Cheatsheet
Νανο Φύλλο Εξαρτήσεων
Φυλλάδιο με συμβουλές για το K8s
Φύλλο ελέγχου Docker Compose
Φύλλο ελέγχου Docker SWARM
Φύλλο ελέγχου Dockerfile
Φύλλο ελέγχου Regex
Φύλλο ελέγχου Sed
Φύλλο ελέγχου επιλογέων CSS
Φύλλο με τσιπς Bash
Φύλλο οδηγιών για την εντολή chmod
Φύλλο οδηγιών για τις εντολές Tmux
Φύλλο οδηγιών εντολών οθόνης
Φύλλο οδηγιών σύνταξης JSONPath
Φύλλο οδηγιών σύνταξης XPath
Φύλλο οδηγιών χρήσης Nginx
Φύλλο οδηγιών χρήσης Powershell
Φύλλο οδηγιών χρήσης VIM
Φύλλο οδηγιών χρήσης σημασιολογικής υποβολής Git
Φύλλο οδηγιών χρήσης της εντολής Zellij
Φύλλο πληροφοριών Markdown
HTML σε markdown
Markdown Lorem Ipsum
tools.markdown-format-converter.name
Από Epub σε Markdown
Βελτιωτής πίνακα Markdown
Γεννήτρια toc markdown
Γεννήτρια πίνακα Markdown
Διαφορά Markdown
Επεξεργαστής Markdown
Επικόλληση ως Markdown
Μείωση σε DOCX
Μείωση σε HTML
Μείωση σε κείμενο
Μείωση στα δεδομένα
Προεπισκόπηση Markdown

Φύλλο με τσιπς 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