#!/bin/sh
sh uses different syntax for operators than bash.
Use -o for or in place of || and -a for and in place of &&.
Shell Symbols
- $1..$9 - arguments
 - $0 - process name
 - $# - number of arguments
 - $? - exit status
 - $$ - PID of this shell
 - $! - PID of the last background command
 - $- - option supplied at shell call (?)
 - $* - all arguments
 - $@ - all arguments with quotes
 
Conditional Statements
- -a and (has higher precedence than -o)
 - -o or
 
String Operators
- = or == equal to
 - -n string is not null
 - -z string is null, that is, has zero length
 
Numeric Operators
- -eq number equals
 - -ne number does not equal
 - -gt greater than
 - -ge greater than or equal to
 - -lt less than
 - -le less than or equal to
 
File Operators
- -e file exists
 - -f file is not a directory or device file
 - -d file exists and is a directory
 - -h file exists and is a symlink
 - -s file exists and has a size greater than zero
 - -w file exists and is writeable
 - -x file exists and is executable
 - -r file exists and is readable
 - -b file is a block device
 - -c file is a character device
 - -p file is a pipe
 - -S file is a socket
 - -O you are owner of file
 - -G you are group owner of file
 
Built-in commands
- : - null command
 - . file - execute command in current shell
 - read - assign var from stdin
 - readonly - mark var as read only
 - trap - trap signals
 - type - inidicate how the shell interprets the command
 - exec - execute command in place of current shell without creating a new process
 - hash - rehash command table
 
Redirect stderr
echo test 2> /dev/null
Redirect stderr to stdout
echo test 2>&1
String Comparison
When checking for string length, include the string in quotes.
Both of these will return true:
[ -n string ] [ -n ]
This will return false:
[ -n "" ]