Shell

Bash shell, Z Shell, etc.

Basic Math

From this stackoverflow answer, to add two numbers and set the result to another, you use $(()) syntax, e.g.

BAZ=$(($FOO + $BAR))

# Incrementing a number
A=$(($A + 1))

Conditionals

spaces around the square brackets are important.

You can reverse conditionals with !:

if [ ! -d "some_directory" ]; then
    echo "'./some_directory' does not exist!"
fi

Numbers

use the -eq (equal), -gt (greater than), -ge (greater than or equal), -lt (less than), -le (less than or equal) operators (amongst others) to compare numbers.

if [ 3 -eq 3 ]; then
    echo "3 is equal to 3"
fi

String

use = and != for string equality

if [ "$MY_STRING_VARIABLE" = "bar" ]; then
    echo "MY_STRING_VARIABLE is bar"
fi

if [ "$MY_STRING_VARIABLE" != "bar" ]; then
    echo "MY_STRING_VARIABLE is not bar"
fi

You can also compare whether they are lexicographically greater than or less than (e.g. “aaaa” is lexicographically less than “aaab”) another string with the \< and \> operators.

if [ "$MY_STRING_VARIABLE" \< "bar" ]; then
    echo "MY_STRING_VARIABLE lexicographically greater than bar"
fi

if [ "$MY_STRING_VARIABLE" \> "bar" ]; then
    echo "MY_STRING_VARIABLE lexicographically lesser than bar"
fi

Regex Matching

Use the =~ operator with a string as the left hand operand and the pattern as the right hand operand.

if [ "$MY_STRING_VARIABLE" =~ '.*' ]; then
    echo "It better have matched, that was wildcard everything."
fi

File/Directories

You can check if a file exists with -f.

if [ -f "some_file" ]; then
    echo "file at './some_directory' exists and is not a directory!"
fi

You can test that a directory exists with -d, e.g.:

if [ -d "some_directory" ]; then
    echo "directory at './some_directory' exists!"
fi

Iterate over Files in a Tree

You can iterate over all files in a tree with:

while IFS= read -r -d '' -u 9
do
    [Do something with "$REPLY"]
done 9< <( find . -type f -exec printf '%s\0' {} + )

(Thanks stackexchange)

Number of Arguments

The number of arguments is represented as $#

if [ $# == 1 ]; then
    echo "There was only one argument passed to $0: $1"
fi

Checking if a command exists

You can check whether a command exists by checking if command -v ${COMMAND_TO_CHECK} >/dev/null 2>/dev/null returns 0 (it exists) or non-zero (does not exist)

if [ ! command -v my_special_script >/dev/null 2>&1 ]; then
    echo "my_special_script not found"
fi

Checking if a string is a number

You can use the -eq operator to verify if something is a number: if ! [ "${some_number}" -eq "${some_number}"] 2>/dev/null; then "${some_number} is not a number"; fi

You can similarly use the -ge to determine if something is a positive number.

Traps

You can use the trap command to run code when the shell script exits (or any signal occurs), like so:

function on_end {
    echo "woohoo"
}

trap on_end exit

which will print “woohoo” to stdout when the script exits.

Last updated: 2020-04-18 15:07:05 -0700