Professional Documents
Culture Documents
Compact Shell Scripting Reference
Compact Shell Scripting Reference
Compact Shell Scripting Reference
2. Reusing
Why recurring the same statements in your shell scripts every time? Develop an effective set of functions and consist of that in
your existing and new shell scripts. Don’t use “echo” while you also can call your own function Display.
3. Always available:
Shell scripting can constantly be used, on each program you encounter. It makes your life simpler by automating repetitive
steps. Just insert your preferred commands in a file, make it executable and run it happily. Simple to learn, and, well also quick
to master.
4. Readability
With a shell script, the possibility of creating things really unreadable is much lower. Sure you can use unique features of the
shell, which others don’t comprehend.
Bash (AKA Bourne Again Shell) is a type of interpreter that processes shell commands. A
shell interpreter takes commands in plain text format and calls Operating System services
to do something. For example, ls command lists the files and folders in a directory.
A shell scripting is writing a program for the shell to execute and a shell script is a
file or program that shell will execute.
Bash (bash) is one of many available (yet the most commonly used) Unix shells. and is a
replacement/improvement of the original Bourne shell (sh).
Shell scripting is scripting in any shell, whereas Bash scripting is scripting specifically for Bash. In practice,
however, "shell script" and "bash script" are often used interchangeably, unless the shell in question is not Bash.
Basic Bash Scripting
Ranges
Forever
for i in {1..5}; do
while true; do echo "Welcome $i"
··· done
done
With step size
for i in {5..50..5}; do
echo "Welcome $i"
done
Functions
.
Defining & Calling functions Returning values Arguments
myfunc() { myfunc() { $# -> Number of arguments
echo "hello $1" local myresult='some value' $* -> All positional arguments (as a
} echo $myresult single word)
} $@ -> All positional arguments (as
separate strings)
# Same as above (alternate syntax)
$1 -> First argument
result="$(myfunc)"
$_ -> Last argument of the previous
function myfunc() {
command
echo "hello $1"
}
Note: $@ and $* must be quoted in
Raising Condition based order to perform as described.
myfunc "John" Otherwise, they do exactly the same
errors thing (arguments as separate
strings).
myfunc() {
return 1 See Special parameters.
}
if myfunc; then
echo "success"
else
echo "failure"
fi
Conditionals
. Conditions Examples
[[ -z STRING ]] - Empty
File conditions # String
string if [[ -z "$string" ]]; then
[[ -n STRING ]] - Not empty [[ -e FILE ]] - Exists echo "String is empty"
string [[ -r FILE ]] - Readable elif [[ -n "$string" ]]; then
[[ STRING == STRING ]] - echo "String is not empty"
[[ -h FILE ]] - Symlink
Equal else
[[ -d FILE ]] - Directory echo "This never happens"
[[ STRING != STRING ]] - Not [[ -w FILE ]] - Writable
Equal Fi
[[ -s FILE ]] - Size is > 0
[[ NUM -eq NUM ]] - Equal
[[ NUM -ne NUM ]] - Not equal bytes # Combinations
[[ NUM -lt NUM ]] - Less than [[ -f FILE ]] - File if [[ X && Y ]]; then
[[ NUM -le NUM ]] - Less than [[ -x FILE ]] - Executable ...
or equal Fi
[[ FILE1 -nt FILE2 ]] - 1 is
[[ NUM -gt NUM ]] - Greater more recent than 2
than # Equal
[[ FILE1 -ot FILE2 ]] - 2 is if [[ "$A" == "$B" ]]
[[ NUM -ge NUM ]] - Greater
than or equal more recent than 1
[[ STRING =~ STRING ]] - [[ FILE1 -ef FILE2 ]] - Same # Regex
Regexp files if [[ "A" =~ . ]]
(( NUM < NUM )) - Numeric
conditions if (( $a < $b )); then
[[ -o noclobber ]] - If echo "$a is smaller than $b"
OPTIONNAME is enabled fi
[[ ! EXPR ]] - Not
[[ X && Y ]] - And if [[ -e "file.txt" ]]; then
[[ X || Y ]] - Or echo "file exists"
fi
Arrays
.
Defining arrays Working with arrays
Operations Iteration
Fruits=("${Fruits[@]}" "Watermelon") # Push for i in "${arrayName[@]}"; do
Fruits+=('Watermelon') # Also Push echo $i
Fruits=( ${Fruits[@]/Ap*/} ) # Remove by regex match done
unset Fruits[2] # Remove one item
Fruits=("${Fruits[@]}") # Duplicate
Fruits=("${Fruits[@]}" "${Veggies[@]}") # Concatenate
lines=(`cat "logfile"`) # Read from file
Dictionaries
.
Defining Working with dictionaries
Options
set -o noclobber # Avoid overlay files (echo "hi" > foo)
set -o errexit # Used to exit upon error, avoiding cascading errors
set -o pipefail # Unveils hidden failures
set -o nounset # Exposes unset variables
Glob options
shopt -s nullglob # Non-matching globs are removed ('*.foo' => '')
shopt -s failglob # Non-matching globs throw errors
shopt -s nocaseglob # Case insensitive globs
shopt -s dotglob # Wildcards match dotfiles ("*.sh" => ".foo.sh")
shopt -s globstar # Allow ** for recursive matches ('lib/**/*.rb' =>
'lib/a/b/c.rb')
*)
echo "Usage: $0 Reading input
{start|stop|ssh}"
Source relative ;; echo -n "Proceed? [y/n]: "
esac read ans
source "${0%/*}/../share/foo.sh" echo $ans
read -n 1 ans # Just one character
List of AWESOME things to do with Shell Scripting
Shell:: https://github.com/alebcay/awesome-shell
Bash: https://github.com/awesome-lists/awesome-bash
Good luck!
I hope you’ll use this knowledge and build
awesome solutions.