Stop script execution, when we encounter error

Team,
Im new to shell scripting please help in below issue:
Considering scenario i have 1.sql,2.sql,3.sql and 4.sql . If my second script fails my loop should come out and should not execute 3.sql and 4.sql.

Here is my code.

#! /bin/bash
echo "exit" | user/password | grep Connected > /dev/null
if [ $? -eq 0 ]
then
   echo "Passed"
   while read file
   do
   echo "Executing file $file..."
   output=`user/password << EOF >> test.log
   @/home/$file`
   done < /home/master.sql
else
   echo "Failed"
   
fi

From the thread title: "Stop script execution, when we encounter error", reading what you have posted, I am totally lost...

OK where do i see them?

So what is the script you posted?
Now even this script puzzles me as I cant see how it works...
Do you mind explaining what this first line is supposed to do?

echo "exit" | user/password | grep Connected > /dev/null

Then
lets say the following works:

if [ $? -eq 0 ]
then
   echo "Passed"
   while read file

Where is file set? ...

Hi vbe,

   while read file
   do
   echo "Executing file $file..."
   output=`user/password << EOF >> test.log
   @/home/$file`
   done < /home/master.sql

Each time through this loop, the variable named file is set by the read command to contain the contents of a line read from the file /home/master.sql . (But, that would only be true if the here-document inside that while read loop was terminated. Oh, well.)

Having said that, I agree with you that I have no idea why finding the string Connected in the output from the utility named user/passwd when it reads a line from standard input that is exit would provide any reason for reading names of files from a file named /home/master.sql .

And, since the here-document terminator (i.e., EOF ) does not appear anywhere in the code provided in post #1, this script can't possibly be working. I'm afraid preethi87 has failed to tell us several things that are important before we will be able to help debug the problem that was specified.

1 Like

Sorry team , let me provide more info..
1.Firstly, it checks for the sql db connection. If connection is success it will execute script/file , if not it prints connection failed and wont execute any scripts.
2.Secondly all my files content resides in sqlfiles, whereas just filename is given in master.sql
3.Finally, if any of the script failed it should come out from the loop.
Eg: if 2.sql is failed with some error

SP2-0734: unknown command beginning "elect * fr..." - rest of line ignored. 

remaining file/script should not get executed and come out of the loop.

In your SQL, do you have WHENEVER ERROR EXIT .something early on? The syntax allows you to set an exit code for your script to pick up, something like this perhaps:-

:
:
deck=sql1.sql                           # The deck of SQL commands you want to run
   sqlplus / <<-EOSQL                   # Logs on with external authentication.  For remote connection use sqlplus <<-EOSQL and include the credentials in the here document
   WHENEVER SQLERROR EXIT 1;            # Set the equivalent of a shell trap
   @$deck ;                             # Run what you want to do.
   exit ;                               # Terminate sensibly
EOSQL                                   # End the here document.
RC=$?

if [ $RC -ne 0 ]
then
   echo "Take some action because ${deck} failed with return code ${RC}"
fi

It's not tested at all because I no longer have an Oracle database to connect to. I might even have the here document wrong, but you get the idea.

I inherently shy away from putting credentials on the same line as the sqlplus because that would make them visible to a ps command whilst your code is running. There are plenty of examples on the board on how to do it properly.

I hope that this helps,
Robin