Bash Cheatsheet
Complete short reference of bash scripting
### 0. Special Characters (more info: http://tldp.org/LDP/abs/html/special-chars.html)
# This is a comment
; # semicolon: put two or more commands in one line.
;; # double-semicolon: terminator for `case` control.
. # dot: represent the current directory or used in regex.
\ # escape: for escaping characters.
/ # path separator.
`anycommand` # backtick: command substitution.
$(...) # alternative to backtick, but also support nesting of commands.
: # null command: Useful in various places, for eg: for `if/then` statement.
! # Negation: Useful in comparison.
* # Wild card or arithmetic operator.
** # double exponential operator.
? # test operator. Have different usage (in regex, double parenthensis etc.)
$ # Variable substitution. Eg: `echo $var`.
${} # See below: Parameter substitution.
$*, $@ # Denotes all arguments of command line in a single string. Quoting necessary.
$1, $2, $3, ... # Denotes specific arguments of command line. If greater than 11, then use ${11}.
$? # Get the exit status of last command.
$$ # Print the process id of the script.
() # For grouping (start child process) and for initializing array.
{x,y,z,...} # Eg: cp file.{txt,md}, copy file.txt to file.md.
{} # Scoping of command and variables. Use this instead of () to stop forking.
[], [[]] # Test expression between this. Use `[]` when you want portable script. Otherwise `[[]]`
# See: https://stackoverflow.com/questions/13542832
# See also: http://wiki.bash-hackers.org/commands/classictest
# `[<expression>]` is equivalent to `test <expression>`.
[] # other uses: for array index, in regex.
((expression)) # equivalent to `let "expression"`.
>, &>, >&, >>, <> # See: http://tldp.org/LDP/abs/html/io-redirection.html#IOREDIRREF
| # Pipe operator: Passes the previous output to next command.
||, && ## Logical OR and AND operator.
& # Command followed by this will run in the background.
- # Multiple usage:
# Specifying option. Double dash (--) for long option
# For redirection from/to stdin/stdout.
# Changes to previous directory `cd -`.
# Arithmetic operator.
+ # Arithmetic, Regular expression and option flag.
% # Modulo arithmetic
= # String comparison and assignment.
## 1. Variables
## -------------
# NOTE:
# You can't assign to reserved environment variables.
# Variables names must not be start with integers and doesn't contain hyphen or reserved characters.
# Don't use `let` to assign string to variables. That variable will always be 0.
foo=val # define variable.
foo="str with spaces" # variable with spaces
let anyvar=3+4 # another way to define variable. Useful for arithmetic operation also.
echo $anyvar # print the var
echo ${anyvar} # alternate way.
echo $? # print the status of previous command.
unset anyvar # unset variable
#### 1.1 Strict Typing Variables
declare -r foo=1 # Marks the variable read only
declare -i foo=2 # Make the variable only integer.
declare -a arr # Will only treat as an array.
declare -f func_name # Will only treat as a function. With no arg, mark all above vars functions.
declare -x foo # Make this variable available for export.
declare -x foo=bar # assign the variable while declaring.
#### 1.2 Internal Variables (only important)
$BASH # Path of the bash
$BASH_VERSION # Version of bash.
$FUNCNAME # Name of current function. For debugging.
$GROUPS # Groups current user belongs to .
$HOME # Home directory path.
$HOSTNAME # hostname
$LINENO # Print current line no. For debugging.
$OSTYPE # Operating system type. eg: linux, windows.
$PATH # Print all bin paths.
$PPID # The parent process id.
$PWD # The current working directory.
$TMPDIR # Print the temporary directory.
$RANDOM # Generate random number. See : http://tldp.org/LDP/abs/html/randomvar.html
$SECONDS # The number of seconds the script running.
$UID # User id number
$0, $1, $2, etc. # Specifies the argument of command line.
$$ # Process ID of the script.
#### 1.3 Parameter Substitution.
${param} # Same as $param, but useful in some cases.
## NOTE: alternative syntax for all below is without `:`, but it doesn't works for null.
${param:-foo} # if param is null or not set, then use `foo`.
${param:=foo} # if param is null or not set, then set `foo` and return value.
${param:+foo} # if param set, use `foo` else return null.
${param:?foo} # if param set, use `param` else return null. Opposite of above.
${param:pos:length}, ${param:pos} # Return `param` from `pos` to that `length` (in second form, full length).
${#param} # Find the length of param. It can be string, array or an integer.
#### 1.4 String Manipulation
# You can perform, array operation on string, similar to C-lang.
## See: http://tldp.org/LDP/abs/html/string-manipulation.html (for using `expr` command)
${str:pos} # Return string from specified position (negative number allowed)
${str:pos:len} # Return string from position to that length.
${str#substr} # Delete shortest match of substring from front of string.
${str##substr} # Delete longest match of substring from front of string.
${str%substr} # Delete shortest match of substring from back of string.
${str%%substr} # Delete longest match of substring from back of string.
${str/substr/replacement} # Replace first match of substring with replacement.
${str//substr/replacement} # Replace all match of substring with replacement.
${str/#substr/replacement} # Replace front match of substring with replacement.
${str/%substr/replacement} # Replace back match of substring with replacement.
## 2. All built-in Commands
## ------------------------
## SEE: http://tldp.org/LDP/abs/html/internal.html#BUILTINREF for examples.
## echo, cd, pwd, pushd, popd, let, set, export, declare, getopts, exit, exec, true, false, help, hash
## 3. Arrays
## ---------
# NOTE : You can perform string operation on array too.
arr[1]=22 # Define array
arr[12]=12 # Array need not be continous. It can be sparse too.
narr=(foo bar too) # Defining array.Another way.
echo ${#narr[0]}; echo ${#narr} # Print 2. length of first element.
echo ${#narr[*]}; echo ${#narr[@]} # Print 3. No of elements in array.
narr2=([0]=foo [2]=bar [4]="quoting") # Another alternate way.
## 4. Control Flow (Loops, If/Else, while, case)
## ---------------------------------------------
# NOTE: Arithmetic operators (<>,==, %, ||, &&) doesn't work inside `[ ... ]`.
# NOTE: Always use `((...))` for arithmetic comparison. Or you've to use `-lt` (symbols) inside [...] for arithmetic.
statement1 && statement2 # and operator
statement1 || statement2 # or operator
### Avoid using these two. Instead use above operator like this: `if [cond1] && [cond2]`; then ...
-a # and operator inside a test conditional expression
-o # or operator inside a test conditional expression
str1=str2 # str1 matches str2
str1!=str2 # str1 does not match str2
str1<str2 # str1 is less than str2
str1>str2 # str1 is greater than str2
-n str1 # str1 is not null (has length greater than 0)
-z str1 # str1 is null (has length 0)
-a file # file exists
-d file # file exists and is a directory
-e file # file exists; same -a
-f file # file exists and is a regular file (i.e., not a directory or other special type of file)
-r file # you have read permission
-r file # file exists and is not empty
-w file # your have write permission
-x file # you have execute permission on file, or directory search permission if it is a directory
-N file # file was modified since it was last read
-O file # you own file
-G file # file's group ID matches yours (or one of yours, if you are in multiple groups)
file1 -nt file2 # file1 is newer than file2
file1 -ot file2 # file1 is older than file2
### You can avoid using these with `((...))`.
-lt # less than
-le # less than or equal
-eq # equal
-ge # greater than or equal
-gt # greater than
-ne # not equal
### If Statement
if list; then list; fi; # `if test condition` is equivalent to `if [condition]`.
if list; then list; elif list; then list; fi;
if list; then list; elif list; ... else list; fi; # elif can be omitted.
### Case statement
case word in
case1)
command;;
case2)
commands;; ## ...and more cases.
esac
### For loop
for name [in list]; do commands; done # optionally `in list` will replaced by `$@`.
for (( exp1; exp2; exp3 )); do commands; done ## same as C-Style loop.
### While loop
while control-cmds; do commands; done
### Until loop
### The loop execute until the test-command succeed.
until test-command; do commands; done
### Select loop
### Common use-case is interactive menu generation.
select word [in list]; do commands; done
### continue and break statement
# `break` and `continue` statement work similarly like C-style programming.
## 5. IO Redirection
## -----------------
## NOTE: `stdin -> 0`, stdout -> 1, stderr -> 2
## See this: http://tldp.org/LDP/abs/html/io-redirection.html
## 6. DEBUGGING
## ------------
set -o noexec # Check syntax error in script without running any commands.
set -o verbose # echos all commands before executing.
set +o verbose # echo off.
Reference
Last updated at: