Cover image

My Shell Script cheat-sheet

← Back to list
Last updated: June 3, 2020
Image by Taylor Wilcox on Unsplash
***

Can't say I use shell scripting a lot, but when I do, I am always struggling with remembering certain useful syntax. So, this is just a reminder for the most frequently-used syntax.

# Save command output to a variable

LIST=$(ls -l)
📃 Copy
The code is licensed under the MIT license

# Get the basename of the full path to the script file

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
📃 Copy
The code is licensed under the MIT license

# Assign the default value to a variable

VERSION="${1:-latest}"
📃 Copy
The code is licensed under the MIT license

# Execute a command for each file in the folder

FOLDER="$(pwd)"
for file in ${FOLDER}/*
do
ls -l "$file"
done
📃 Copy
The code is licensed under the MIT license

# Get basename of a path

basename /foo/bar/baz/wheel.txt
📃 Copy
The code is licensed under the MIT license

# Check if file exists

FILE=/etc/hosts
if [[ -f "$FILE" ]]; then
echo "$FILE exists."
else
echo "$FILE does not exist."
fi
if [[ ! -f "$FILE" ]]; then
echo "$FILE does not exist."
else
echo "$FILE exists."
fi
📃 Copy
The code is licensed under the MIT license

# Read environment variables from a file and define them

The variables will be only visible to the current process.

if [ -f .env ]
then
export $(cat .env | xargs)
fi
📃 Copy
The code is licensed under the MIT license

# Default aliases and startup settings

On every new machine I prefer having some predefined aliased and settings I am used to. So normally I write this:

👉 📃  ~/.bash_profile
export PS1='[\t]:\u@\W\$ '
export PATH=${PATH}:${HOME}/bin
alias ll="ls -alFh"
alias cp="cp -r"
📃 Copy
The code is licensed under the MIT license

I always keep forgetting to apply it immediately afterwards ^^

source ~/.bash_profile
📃 Copy
The code is licensed under the MIT license

# Prompt a user

read -p "Running this script will sell your kidney. Proceed? " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
# dangerous operation here
fi
📃 Copy
The code is licensed under the MIT license

# Create functions

function enterDir {
echo "Entering $1"
pushd $1 > /dev/null
}
enterDir /tmp/foo
📃 Copy
The code is licensed under the MIT license

# Set the script to stop on error

set -e
📃 Copy
The code is licensed under the MIT license

# Process arguments

while getopts a:b:c: flag
do
case "${flag}" in
a) OPTION_A=${OPTARG};;
b) OPTION_B=${OPTARG};;
c) OPTION_C=${OPTARG};;
*) exit 1
esac
done
echo ${OPTION_A}
echo ${OPTION_B}
echo ${OPTION_C}
📃 Copy
The code is licensed under the MIT license

This can be really powerful when combined with the default value setter.

# Check if a command is available

if ! command -v <command_name> &> /dev/null
then
echo "The command was not found"
exit
fi
📃 Copy
The code is licensed under the MIT license

# Get the exit status of the latest command

ls foo
if [[ $? -ne 0 ]]; then
echo "No such directory"
fi
📃 Copy
The code is licensed under the MIT license

# Replace strings in a file

Not exactly related to Shell scripting, but still could be useful in many cases.

@awk '{sub("fromstring","tostring")} {print}' ./.env.sample > temp.txt
@mv temp.txt ./.env.test
📃 Copy
The code is licensed under the MIT license

or, better:

sed -e "s/one/another/g" -e "s/string1/string2/g" file.txt > altered_file.txt
📃 Copy
The code is licensed under the MIT license
Sergei Gannochenko
Sergei Gannochenko
Business-focused product engineer,  in ❤️ with amazing products 
AI, Golang/Node, React, TypeScript,  Docker/K8s, AWS/GCP, NextJS 
20+ years in dev