105.2 Customize or write simple scripts
Candidates should be able to customize existing scripts, or write simple new Bash scripts.
Key Knowledge Areas:
- Use standard sh syntax (loops, tests)
- Use command substitution
- Test return values for success or failure or other information provided by a command
- Perform conditional mailing to the superuser
- Correctly select the script interpreter through the shebang (#!) line
- Manage the location, ownership, execution and suid-rights of scripts
Terms and Utilities
Are a way of automating tasks.
If a line starts with
#! it is called shebang and tells the shell what interpreter to use for running this script.
Note: Normally a
#at the beginning of a script is for showing comments. Do not confuse it with Shebang (#!)
In many cases we run shells with
We can use the command we already know in our shell scripts. A sample is:
#!/bin/bash echo echo "We are learning! Wowww..." echo
Already seen in some parts. You can define variables like this
VARNAME=VALUE. A sample:
#!/bin/bash NAME=Jadi echo echo "$NAME is learning! Wowww..." echo
Note: you can also do NAME="Jadi"
Sometimes you need to have a variable with the result of something to a variable. In this case you can use $() construct:
If the file is executable, we can run them using the ./script_name.sh if we are in the same directory, or give the complete path or include their directory ine $PATH variable. As you can see they are just normal programs.
Another way is giving our scripts name as a parameter to the
Note: you know that for making a file executable we can do
chmod 755 filenameor
chmod +x fiename.
Up to now, we were just running commands one by one. That is not very programmatic. If we are going to have some logic in our programs, we need conditions and loops. First we will cover conditions, using the
if command. Its usage is like this:
if [condition] then do something do another thing else do new things even funnier things fi
Note: else part is optional,
Conditions can be TRUE or FALSE. A very simple conditions is
if [ "Linux" = "Linux" ]. Silly? I know but we will change it soon but for now, learn the syntax! Specially the spaces and = for checking if two strings are equal.
#!/bin/bash kernel=$(uname -s) if [ $kernel = "Linux" ] then echo YES. You are using a Linux else echo "Not a linux :(" fi
Note spaces and using doublequotes (") on seccond echo because it has
(character which will be interpreted by bash if we do not enclose the string in a doublequote.
The actual checking of the condition is done by
test command which is writter as
[ some test ]. There are the other options:
|conditions||what is means|
|"a" = "b"||if two strings are equal (here it will return False)|
|"a" != "b"||string a is not equal to string b|
|4 -lt 40||if 4 is lower than 40 (True)|
|5 -gt 15||if 5 is greater than 15 (False)|
|5 -ge 5||if 5 is greater or equal 5|
|5 -le 3||if 5 is lower or equal to 3|
|9 -ne 2||9 is not equal with 2 (True)|
|-f FILENAME||if file FILENAME exists|
|-s FILENAME||if file exists and its size is more than 0|
|-x FILENAME||file exists and is executable|
read we can read the user input. Look at this:
1 #!/bin/sh 2 3 echo "what is your name?" 4 read NAME 5 6 echo "Hello $NAME" 7 8 if [ $NAME = "Jadi" ] 9 then 10 echo "Oh I know you!" 11 else 12 echo "I wish I knew you" 13 fi 14 15 echo "Bye"
Generaly loops are used to run a specific set of commands more than once. The syntax is like this:
for VAR in SOME_LIST; do some stuff with $VAR some other stuff done
On each loop, the VAR will be equal to one of the SOME_LIST elements. SOME_LIST can be numbers, name of files, words, ...
for NUM in 1 2 3 4 5 6; do echo $NUM done
But what if you needed to go 1 to 42? We have the
seq command which can be used like
seq 1 42 or a shorthand like
Good part is we can use non-numbers too!
for FILE in $(ls); do echo $FILE wc $FILE done
This is another kind of loop but loops while a conditions is TRUE. This is the syntax:
while [condition] do do something do anohter thing done
Note: If your condition will remains true all the time, the while loop will run forever. This is called an infinite loop
This is sample:
VAR=52 while [ $VAR -gt 42 ] do echo VAR is $VAR and it is still greater than 42 let VAR=VAR-1 done
we will have an infinite loop if we use
let VAR=VAR+1. Ctrl+C will help us to break the loop.
letusage! If you just just say
VAR=$VAR+1, then VAR will be equal to
1+1as an string!.
mailing the root user
For sending mail, you need to install
mailutils. Then the
[email protected]:~$ mail root Cc: Subject: Hi there root hello there. This is my mail
And root will get this email. She can read it using
If you need to send emails in a script, just do:
$ echo "Body!" | mail -s "Subject" root
This can be easily embeded as poart of your scripts!