There are 2 types of CLI or shelss that are used in Unix-based OS like Linux and macOS
Bash (Bourne-Again-SHell)
Shell
To check which shell program is currently running on your OS
echo $SHELL
# use sh command to go to Bourne shell
phuong@home:~$ sh
$
Scripting 101
Var
Case-sensitive, lower-case and underscores.
Start with $. e.g $my_variable
no space trailing allow
# bad example
my_var = hello-world
# good example
my_var=hello-world
Include variable in a string in bash, using curly braces
# include var in string
mkdir ${folder_name}_bk
Passing args
# argument start from 1, so the 1st arg is $1
# assigning var to 1st arg
folder_name=$1
mkdir $foler_name
Input prompting
# read the input from command line
read folder_name
mkdir $folder_name
# prompting user before reading
read -p "Enter folder name:" folder_name
mkdir $folder_name
Operations (expr)
# must have while space before and after = sign
$ expr 6 + 3
9
$ expr 6 - 3
3
# using \ to escape the multiply sign
$ expr 6 \* 3
18
# only return decimal, not supporting floating point
$ expr 10 / 3
3
# to return floating point, using bc -l
$ expr 10 / 3 | bc -l
3.333333
Double parentheses
Using double parenteses to perform arithmetic operations and comparation
Arithmetic operations
# no need to escape * using \ any more
# no need to use expr
a=5
b=10
c=$((a + b))
d=$((a * b))
Comparison
a=5
b=10
if ((a < b)); then
echo "a is less than b"
fi
Flow control
Condition
a=5
b=10
# using double [[ ]] to check the condition
if [[a -lt b]]
then
echo "a is less than b"
elif [[a -gt b]]
echo "a is greater than b"
else
echo "a equal b"
fi
Loop
For loop
for x in 1 2 3
do
echo "do this $x time"
done
# or to loop 1 to 3
for x in {1..3}
do
echo "do this $x time"
done
# using double brackets
for (( x = 1 ; x <= 3; x++ ))
do
echo "do this $x time"
done
# loop through files in folder
for file in $(ls)
do
echo "Line count of $file is $(cat $file | wc -l)"
done
While loop
# basic usage
while True
do
echo "Hello world"
break
done
Add the shebang line to the top of the script, so that even if the script is running from an unsupported shells, it will use the /bin/bash interpreter.
#!/bin/bash
Exit code
# exit code stored in $
# 0: success
$ ls -la
$ echo $?
0
# >0: failure
$ lss
$ echo $?
127
# you can specify an exit code by using exit command
exit 25
Function
Using function to break up large script to smaller one. 1 function only performs a task.
#!/bin/bash
function add() {
sum=$(( $1 + $2 ))
# this statement like return statement
echo $sum
}
result=$(add 3 5)
echo "The result is $result"
Best practices
Design for re-usable, avoid duplicate code
Should not require to be edited before running
Use command line arguments to pass inputs.
Always return approriate exit codes in your script (0: success, >0: failure)
The shebang is placed at the 1st line of the script.