-e exits on error, -u treats unset variables as errors, -o pipefail catches failures in pipes.
| Expression | Description |
|---|---|
| VAR=value | Assign a value |
| $VAR | Read the value |
| ${VAR} | Read with explicit boundary |
| "$VAR" | Read safely with quoting |
| ${VAR:-default} | Use default if VAR is unset or empty |
| ${VAR:=default} | Assign default if VAR is unset or empty |
| ${VAR:+alternate} | Use alternate if VAR is set and not empty |
| ${VAR:?error msg} | Exit with error if VAR is unset or empty |
| ${#VAR} | Length of the value |
| readonly VAR | Make variable read-only |
| export VAR | Make variable available to child processes |
| Variable | Description |
|---|---|
| $0 | Name of the script |
| $1..$9 | Positional parameters (arguments) |
| ${10} | Positional parameters beyond 9 |
| $# | Number of arguments |
| $@ | All arguments as separate words |
| $* | All arguments as a single string |
| $? | Exit status of the last command |
| $$ | PID of the current shell |
| $! | PID of the last background command |
| $_ | Last argument of the previous command |
| Expression | Description |
|---|---|
| ${VAR#pattern} | Remove shortest match from start |
| ${VAR##pattern} | Remove longest match from start |
| ${VAR%pattern} | Remove shortest match from end |
| ${VAR%%pattern} | Remove longest match from end |
| ${VAR/old/new} | Replace first occurrence |
| ${VAR//old/new} | Replace all occurrences |
| ${VAR:offset} | Substring from offset |
| ${VAR:offset:length} | Substring from offset with length |
| ${VAR^} | Uppercase first character |
| ${VAR^^} | Uppercase all characters |
| ${VAR,} | Lowercase first character |
| ${VAR,,} | Lowercase all characters |
| Operator | Description |
|---|---|
| -f file | True if file exists and is a regular file |
| -d file | True if file exists and is a directory |
| -e file | True if file exists (any type) |
| -r file | True if file is readable |
| -w file | True if file is writable |
| -x file | True if file is executable |
| -s file | True if file is not empty |
| -z string | True if string is empty |
| -n string | True if string is not empty |
| == | String equality |
| != | String inequality |
| =~ | Regex match (inside [[ ]]) |
| -eq | Numeric equality |
| -ne | Numeric inequality |
| -lt | Numeric less than |
| -le | Numeric less than or equal |
| -gt | Numeric greater than |
| -ge | Numeric greater than or equal |
| Expression | Description |
|---|---|
| arr=(a b c) | Declare an array |
| arr[0]=value | Set element by index |
| ${arr[0]} | Access element by index |
| ${arr[@]} | All elements |
| ${#arr[@]} | Number of elements |
| ${arr[@]:1:2} | Slice: 2 elements starting at index 1 |
| arr+=(d e) | Append elements |
| ${!arr[@]} | All indices |
| unset arr[1] | Remove an element |
| Expression | Description |
|---|---|
| $((a + b)) | Addition |
| $((a - b)) | Subtraction |
| **$((a * b))** | Multiplication |
| $((a / b)) | Integer division |
| $((a % b)) | Modulo |
| $((a b))** | Exponentiation |
| $((a++)) | Post-increment |
| $((++a)) | Pre-increment |
| let "a += 5" | Arithmetic assignment |
Lines of text go here.
Variables like $HOME are expanded.
| Option | Description |
|---|---|
| set -e | Exit immediately on error |
| set -u | Error on undefined variables |
| set -o pipefail | Pipe fails if any command fails |
| set -x | Print each command before executing (debug) |
Curated for the Linux community