You are on page 1of 10

A Shell Script to do shell scripting faster

Shell Scripting is all about automating a particular task, doing a task a bit faster than what it
takes to do manually. However, when we write a shell script, if we notice properly, the amount of
time we take to get it done is little more. In other words, can we think of ways in which we can
write and test a shell script faster?

Typically, when we write a shell script, we open the editor, write something, save and close it.
Run the script. Depending on the output or some error thrown, open the file again, edit
something, save and close it. Run the script, and this goes on and on and on. The focus here is
the amount of time you spent on saving the file every time, running it, and again opening the file
and repeating this whole process umpteen times. In some cases, while running, we get error, and
by the time we re-open the file, we forget what the error is. Now, again run the script and see the
error again and re-open it. The amount of time we spend here is pretty high.

Sometimes, what people do is, they keep 2 terminals open, edit and save the file in one
terminal, and keep running the script in the other. This is a good time saver, but let us see what
can be done to save the maximum amount of time to write and test a script.

The method which we are going to discuss to make this process faster involves two steps:

1. Map a key in vi to save and close a file.


2. Write a shell script which will open the file(which is a shell script), and run the script.

Lets discuss those 2 points in detail:

1. Let us map the function key F2 in vi to do a save a close. The following is the line which we
should add in the .exrc or the .vimrc file. Once the below line is added, on pressing F2 inside vi,
the file will get saved and quit vi.

map #2 :wq!^M

Note: ^M is put using the following sequence: Ctrl+V+M

#2 refers to the function key F2. The above setting will work if your Unix flavor is Solaris or
Linux. If it is HP-UX, refer this link: Mapping function keys in vi

2. Write a small script, with the following contents. I name this script as workon:
$ cat workon

#!/usr/bin/bash

if [ ! -f $1 ]; then

echo "#!/usr/bin/bash" > $1

fi

while [ 1 ];

do

vi $1

chmod 755 $1

./$1

read dummy

done

What this script does is simple: It accepts a file name as argument, which is a shell script in our
case. If the file is empty, adds the she bang line and gets it ready. Else simply opens the file. On
closing the file, runs the script and the output is displayed. On pressing any key, it takes you back
to vi again. And the cycle repeats.

Now, lets write a sample script, test.sh.

1. Invoke the workon script with the test.sh as its argument:


2. On invoking workon, the below screen will be opened. As you see, the she bang line gets
added automatically since its a new file:
3. Let us edit the file and put some contents in it:
4. Press F2 to save and run the file. As seen below, the output is displayed:
5. Press 'Enter' to edit the file again, and the cycle repeats:
In this way, we can write and test a shell script much much faster.

Generic workon script:


The next question, can we customize this workon script even more?
For example, if you are a developer, at a given point of time, you might be writing a C/C++
program, or a Java program or a shell script or a perl script or a python script or a PL/SQL script
and so on.When we write a C program, on pressing F2, we would like it to get compiled and the
program be run, and the same holds good for Java programs as well. Like the she bang line
added automatically for a shell script, we would also like the same to get added for a Perl or
Python script. Similarly, for a PL/SQL script, we would like the SET statements to get added
automatically.

The below shown program is the customised workon program which I use. Hope it might be
useful for you too. You might customize it further to suit your needs:

#!/usr/bin/bash

file=`echo $1 | sed 's/\(.*\)\.\(.*\)/\1/'`

ext=`echo $1 | sed 's/.*\.\(.*\)/\1/'`

if [ ! -f $1 ]; then

if [ $ext = "pl" ]; then

echo "#!/usr/bin/perl " > $1

elif [ $ext = "py" ]; then

echo "#!/usr/bin/python " > $1

elif [ $ext = "c" ]; then

echo "#include<stdio.h>" >> $1

echo -e "int main()\n{ \n\n} " >> $1

elif [ $ext = "sql" ]; then

echo "WHENEVER SQLERROR EXIT 1 " > $1

echo "SET SERVEROUTPUT ON" >> $1

echo "SET PAGESIZE 0" >> $1

echo "SET FEEDBACK OFF" >> $1


echo "SET VERIFY OFF" >> $1

echo "SET HEADING OFF" >> $1

echo -e "\n\nDECLARE\n\n\n" >> $1

echo -e "BEGIN\n\n\n" >> $1

echo -e "END;\n/" >> $1

else

echo "#!/usr/bin/bash" > $1

fi

fi

while [ 1 ];

do

vi $1

chmod 755 $1

if [ $ext = "java" ]; then

javac $1

[ $? -eq 0 ] && java $file

elif [ $ext = "c" ]; then

gcc $1

[ $? -eq 0 ] && ./a.exe

elif [ $ext = "sql" ]; then

sqlplus -s sys/unix11@xe @$1 <<EOF

exit
EOF

else

./$1

fi

read dummy

done

Enjoy the world of automation!!!


- See more at: http://www.theunixschool.com/2011/08/shell-script-to-do-shell-
scripting.html#sthash.LY9fa6zZ.dpuf

You might also like