First let me clarify that this is not going to be a detailed study of shell scripting, but as the name of the post indicates, it will be a quick reference to the syntax used in scripting for the bash shell. So if you are expecting the former, then you should buy yourself a good book on shell scripting . ;-) So let's move on to the guide. Start your stop watch now.
-- Start of The 10 secs Guide to Bash Scripting --
Common environment variablesPATH - Sets the search path for any executable command. Similar to the PATH variable in MSDOS.
HOME - Home directory of the user.MAIL - Contains the path to the location where mail addressed to the user is stored.
IFS - Contains a string of characters which are used as word seperators in the command line. The string normally consists of the space, tab and the newline characters. To see them you will have to do an octal dump as follows:
$ echo $IFS | od -bcPS1 and PS2 - Primary and secondary prompts in bash. PS1 is set to $ by default and PS2 is set to '>' . To see the secondary prompt, just run the command :
$ ls |... and press enter.USER - User login name.
TERM - indicates the terminal type being used. This should be set correctly for editors like vi to work correctly.
SHELL - Determines the type of shell that the user sees on logging in.Note: To see what are the values held by the above environment variables, just do an echo of the name of the variable preceeded with a $. For example, if I do the following:
$ echo $USER
ravi... I get the value stored in the environment variable USER.Some bash shell scripting rules
1) The first line in your script must be
#!/bin/bash ... that is a # (Hash) followed by a ! (ban) followed by the path of the shell. This line lets the environment know the file is a shell script and the location of the shell.
2) Before executing your script, you should make the script executable. You do it by using the following command:
$ chmod ugo+x your_shell_script.sh 3) The name of your shell script must end with a .sh . This lets the user know that the file is a shell script. This is not compulsary but is the norm.
Conditional statements
The 'if' Statement - evaluates a condition which accompanies its command line. Those words marked in blue are compulsory. But those marked in red are optional.
syntax:if condition_is_true
then
execute commands
else
execute commands
fi if condition also permits multiway branching. That is you can evaluate more conditions if the previous condition fails.
if condition_is_true
then
execute commands
elif another_condition_is_true
then
execute commands
else
execute commands
fiExample :if grep "linuxhelp" thisfile.html
then
echo "Found the word in the file"
else
echo "Sorry no luck!"
fiif's companion - testtest is an internal feature of the shell. test evaluates the condition placed on its right, and returns either a true or false exit status. For this purpose, test uses certain operators to evaluate the condition. They are as follows:
Relational operators
-eq Equal to
-lt Less than
-gt Greater than
-ge Greater than or equal to
-lt Less than
-le Less than or equal to File related tests-f file True if file exists and is a regular file
-r file True if file exists and is readable
-w file True if file exists and is writable
-x file True if file exists and is executable
-d file True if file exists and is a directory
-s file True if file exists and has a size greater
than zero.String tests-n str True if string str is not a null string
-z str True if string str is a null string
str1 == str2 True if both strings are equal
str1 != str2 True if both strings are unequal
str True if string str is assigned a value
and is not null.Test also permits the checking of more than one expression in the same line.-a Performs the AND function
-o Performs the OR functionExample:test $d -eq 25 ; echo $d... which means, if the value in the variable d is equal to 25, print the value.test $s -lt 50; do_somethingif [ $d -eq 25 ]
then
echo $d
fi In the above example, I have used square brackets instead of the keyword test - which is another way of doing the same thing.
if [ $str1 == $str2 ]
then
do something
fi
if [ -n "$str1" -a -n "$str2" ]
then
echo 'Both $str1 and $str2 are not null'
fi
... above, I have checked if both strings are not null then execute the echo command.Things to remember while using test
If you are using square brackets [] instead of test, then care should be taken to insert a space after the [ and before the ].
Note: test is confined to integer values only. Decimal values are simply truncated.Do not use wildcards for testing string equality - they are expanded by the shell to match the files in your directory rather than the string.
Case statement
Case statement is the second conditional offered by the shell.
Syntax:
case expression in
pattern1) execute commands ;;
pattern2) execute commands ;;
...
esac The keywords here are in, case and esac. The ';;' is used as option terminators. The construct also uses ')' to delimit the pattern from the action.
Example:
...
echo "Enter your option : "
read i;
case $i in
1) ls -l ;;
2) ps -aux ;;
3) date ;;
4) who ;;
5) exit
esac
Note: The last case option need not have ;; but you can provide them if you want.Here is another example:
case `date |cut -d" " -f1` in
Mon) commands ;;
Tue) commands ;;
Wed) commands ;;
...
esac
Case can also match more than one pattern with each option.You can also use shell wild-cards for matching patterns.
...
echo "Do you wish to continue? (y/n)"
read ans
case $ans in
Y|y) ;;
[Yy][Ee][Ss]) ;;
N|n) exit ;;
[Nn][Oo]) exit ;;
*) echo "Invalid command"
esac
In the above case, if you enter YeS, YES,yEs and any of its combinations, it will be matched.
This brings us to the end of conditional statements.
Looping Statements
while loop
Syntax :
while condition_is_true
do
execute commands
done
Example:while [ $num -gt 100 ]
do
sleep 5
done
while :
do
execute some commands
done
The above code implements a infinite loop. You could also write 'while true' instead of 'while :' .
Here I would like to introduce two keywords with respect to looping conditionals. They are break and continue.
break - This keyword causes control to break out of the loop.continue - This keyword will suspend the execution of all statements following it and switches control to the top of the loop for the next iteration.
until loop
Until complements while construct in the sense that the loop body here is executed repeatedly as long as the condition remains false.
Syntax:until false
do
execute commands
done
Example:...
until [ -r myfile ]
do
sleep 5
done
The above code is executed repeatedly until the file myfile can be read.for loop
Syntax :
for variable in list
do
execute commands
done
Example:...
for x in 1 2 3 4 5
do
echo "The value of x is $x";
done
Here the list contains 5 numbers 1 to 5. Here is another example:
for var in $PATH $MAIL $HOME
do
echo $var
done
Suppose you have a directory full of java files and you want to compile those. You can write a script like this:
...
for file in *.java
do
javac $file
done
Note: You can use wildcard expressions in your scripts.A few special symbols and their meanings w.r.t shell scripts
$* - This denotes all the parameters passed to the script
at the time of its execution. Which includes $1, $2
and so on.
$0 - Name of the shell script being executed.
$# - Number of arguments specified in the command line.
$? - Exit status of the last command.
The above symbols are known as positional parameters. Let me explain the positional parameters with the aid of an example. Suppose I have a shell script called my_script.sh . Now I execute this script in the command line as follows :
$ ./my_script.sh linux is a robust OS
... as you can see above, I have passed 5 parameters to the script. In this scenario, the values of the positional parameters are as follows:
$* - will contain the values 'linux','is','a','robust','OS'.$0 - will contain the value my_script.sh - the name of the script being
executed.
$# - contains the value 5 - the total number of parameters.
$$ - contains the process ID of the current shell. You can use this parameter while giving unique names to any temporary files that you create at the time of execution of the shell.
$1 - contains the value 'linux'
$2 - contains the value 'is'
... and so on.
The set and shift statements
set - Lets you associate values with these positional parameters .
For example, try this:
$ set `date`
$ echo $1
$ echo $*
$ echo $#
$ echo $2
shift - transfers the contents of a positional parameter to its immediate lower numbered one. This goes on as many times it is called.
Example :
$ set `date`
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3
$ shift
$ echo $1 $2 $3
To see the process Id of the current shell, try this:$ echo $$
2667
Validate that it is the same value by executing the following command:$ ps -f |grep bashread statementMake your shell script interactive. read will let the user enter values while the script is being executed. When a program encounters the read statement, the program pauses at that point. Input entered through the keyboard id read into the variables following read, and the program execution continues.
Eg:#!/bin/sh
echo "Enter your name : "
read name
echo "Hello $name , Have a nice day."
Exit status of the last commandEvery command returns a value after execution. This value is called the exit status or return value of the command. A command is said to be true if it executes successfully, and false if it fails. This can be checked in the script using the $? positional parameter.
Here I have given a concise introduction to the art of bash shell scripting in Linux. But there is more to shell scripting than what I have covered. For one, there are different kinds of shells, bash shell being only one of them. And each shell has a small variation in its syntax. Like the C shell for example, which uses a syntax close to the C language for scripting. But what I have covered above applys to all the shells.
-- End of The 10 secs Guide to Bash Scripting --
Now check how much time you have taken to cover this much.What? You say you have taken more than 10 secs to read the guide ? Then please enter a comment explaining your reasons for taking so much time and I will send you a free gift as compensation for the extra time you spent here.
But if you have taken less than 10 secs to read through the guide, please enter a comment explaining how you accomplished this extraordinary feat. And I will send you a free gift too.
Update (March 8 2006) : On the left column of this blog, you will see a link to a PDF document. That is the free gift. Enjoy!


40 comments:
I knew most of it, but thanx for going in such a great detail it makes a great refererence.
email: dejan1 [at] gmail.com
Great reminder, thanks a lot. Now i'll not need to look for reminders in "Advanced bash scripting" any more :)
Hello,
I read the guide and it took me much longer than 10 seconds, but it was worth it. I know a little bit of shell scripting but this was a good read. Worth every extra second.
roberto[dot]villarreal[at]gmail[dot]com
roberto,
I have sent you the free gift. Please check your mail.
Hope you find it useful.
ok it did take me more than 10 seconds, Although I knew most of it, especially the part abou t Relational Operators was good to re-read.
As per usual, your articles are of a high standard and a pleasure to read..
blackpanther.blogs [at] gmail.com
Excellent guide. Guess I have to save it and read it offline. And hey tomorrow is my lab and I have to learn Bash Scripting for it. Thanks a lot man.
srinivasanr [AT] gmail [DOT] com
Thanks for the great post! It helped explain a number of questions that I've had for some time . . . especially "while : "
djohngo [at] gmail.com
hi ravi,
awesome post - I finished it in 11 seconds because I got distracted part of the way through and had to beat HL2.
rewilliams [at] firstam.com
Short and crisp.. Very nice..
Regards,
Kamesh
Looks good; if anyone looking to get into more details see
Linux Shell Scripting Tutorial - A Beginner's handbook
BASH Programming - Introduction HOW-TO
More info can be found here
hope this will help others
--
V. Anand
. o O (now where is my gift)
oh sorry ravi i forgot to type email id... well if you read big book it will take more time to go through it but this is like what is syntax of if and i can finish it .. it took more than 30 sec i guess but i like it and here is my id
ilmynix [at] yahoo [dot] com
all the best
Nice short summary. Did help for sure.
Ravi--
very nice guide! Have toyed with bash scripting but haven't gotten much further than adding the essential first line & then some kstart commands; off the top of my head, though, for correctness, you say
"1) The first line in your script must be
#!/bin/bash
... that is a # (Hash) followed by a ! (ban)"
If I remember correctly, I think the ! is actually called bang, not ban.
Great guide nonetheless--I think it will help me ease into bash even more!
"1) The first line in your script must be
#!/bin/bash
I thing, more correct is
#! /bin/bash
(space after a bang). As i remember, the form with space was original. After, the space was made optional to do it more user friendly. But, I may be wrong.
Great tutorial! It took me longer than 10 seconds, but it was time well spent-- I had grown weary of sifting through manuals and lengthy tutorials just to get basic information. Now I have everything I need to finish a number of elementary scripts I've had laying around.
Thanks!
greyspace [AT] systemshell [DOT] net
Ahh great stuff! I had to try each example as I went thru, so maybe that's how i took an hour to finish!
vusadube[at]yahoo[dot]com
Very good article. It is in my "HOWTO" directory already.
darko2 [at] varnost [dot] si
*whew* that was long 10 seconds!
good work. i'm digging in...
Hi,
Thanks man....it was very helpful
:)
Proton
a nice and concise guide of shell scripting fundamental
wow, this took a lot longer than 10 seconds, but great examples.
i'm a slow reader! good read though. curious about the gift but a little scared. oh well, curiosity evades fear until the end.
leeach [at] gmail.com
Hey cool site, i had a chance to look at quite a fews sites arround but amazing to see most usefull learning tips in one single site.
helps ppl learn easily what they forgot over a period of time :)
sai_foru@myway.com
Thanks
Saikumar
&&&& PLEASE NOTE &&&&&
Thanks for sharing your views about this post.
I have sent all of you the free gift. All other late visitors can download the free gift from the main page of this blog. Click Here and look at the right hand side. You will find a PDF document. That is the free gift.
You are free to comment your views but please do not leave your email ID with your comment.
Thanks for your cooperation. :)
Thanks alot Ravi. I am very new to Linux and programming in general, but already have found the need to write a simple script. This will defenitely come in handy.
Nice quick guide, but I wanted to point out that
test $d -eq 25 ; echo $d
is incorrect. If you want to only print d if it equals 25, then you should use
test $d -eq 25 && echo $d
The semicolon will act to separate different commands (so you can enter multiple commands on one line). The double ampersands (logical AND operator) will only perform the right command if the left one exited with status 0.
Similarly, there is the || (logical OR operator). It will only run the right command if the left command DOESN'T exit with status 0.
(If anyone is not sure what I mean by exit status, try doing "echo $?" that will print the exit status of the last run program.)
Hi!
I loved your guide since I am new at bash scripting but not new at programming so it's an excellent reference guide....
Just wanting to point out a typo.
At the case statement(4th example):
echo "Do you wish to continue? (y/n)"
read $ans
"read $ans" should be "read ans"
Thanks a lot and I got your gift also :)
cool!!
Perfect article!! =D
Congratulations- this is the best "gentle introduction to BASH" I've found on the web. I've also created a BASH Quick Reference Card with just the BASH I need to know on a daily basis. Hope you find it useful too.
Good job out there :)
Very very nice, thanks!
Great!!...
Its good refresher in these topics..
Hey... its a great article. very informative and concise.
Good Doc!!!
Congrats dude
Thanks! This is a very god reference written with clear examples
Cheers
Thanx man...ur blog helped me revise for my viva :)
Nice post.
I have a BASH one liner blog,
http://unstableme.blogspot.com/
//Jadu
Thx for the clear explanation of "read" statement. It was a big help.
Nice work, I don't use bash frequently, so this quick guide helps me a lot.
I found very useful for comparing real values this expression:
if [ `echo $real1 "<" $real2 | bc -l` -eq 1 ] then....
thanks and sorry for my english
Francisco
java -jar $HSQLDB_HOME/lib/hsqldb.jar localhost-sa
set password "shopritedb";
CREATE USER newuser PASSWORD newpass ADMIN;
cltr c to exit sql
how do i put this in a bash script?
Post a Comment