Need help in shell scripting


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Need help in shell scripting
# 1  
Old 03-09-2017
Question Need help in shell scripting

Hi, I am trying to execute below script but it is failing with error. Can someone please let me know the fix for this.

This is solaris server.

Code:
 if [ test $(find $BDUMP_DEST/alert_$ORACLE_SID.log -type f -size +5120c) ]

I am trying to find the alertlog size > 5KB. Below is the script.

Code:
 if [ test $(find $BDUMP_DEST/alert_$ORACLE_SID.log -type f -size +5120c) ]
                        then
                        cd $BDUMP_DEST
                        find . -name '*.gz' -mtime +90  | xargs rm -rf
                        cp alert_$ORACLE_SID.log alert_$ORACLE_SID.log_${NOW}
                        gzip alert_$ORACLE_SID.log_${NOW}
                        cat /dev/null > alert_$ORACLE_SID.log
                        cd ~
                        fi

Thanks,
Akhil
Moderator's Comments:
Mod Comment This thread has been moved to a technical forum appropriate for this topic.

And, CODE tags have been added to the code segments.

Please review the forum rules that you agreed to follow when you joined this forum.

Last edited by Don Cragun; 03-09-2017 at 11:37 PM.. Reason: Add CODE and ICODE tags.
# 2  
Old 03-10-2017
Making a few wild guesses at what you're trying to do, what operating system you're using, and hoping that you're using a shell that conforms to basic POSIX standard requirements, you might want to try the following replacement for your code:
Code:
if test "$(find "$BDUMP_DEST/alert_$ORACLE_SID.log" -type f -size +10)"
then	cd "$BDUMP_DEST"
	find . -name '*.gz' -mtime +90 -exec rm -f {} +
	cp "alert_$ORACLE_SID.log" "alert_$ORACLE_SID.log_${NOW}"
	gzip "alert_$ORACLE_SID.log_${NOW}"
	> "alert_$ORACLE_SID.log"
	cd
fi

This User Gave Thanks to Don Cragun For This Post:
# 3  
Old 03-10-2017
I dont mean to hijack, but Don, does the last 'cd' above return the shell to the previous spot then? For instance, the same as what a PUSHD and POPD do in DOS?
# 4  
Old 03-10-2017
A plain cd would put you in your home directory, as defined by $HOME at the time you execute it. Using cd ~ has the same effect but could be extended so you can cd ~/.ssh to change to subdirectories of whatever $HOME points to.

Perhaps you would be safer to use pushd & popd or save the current directory to a variable and explicitly change to that at the end of the section.



Robin
# 5  
Old 03-10-2017
still getting error

Hi I am getting below error after modifying the script as told by you. I am also putting my full script here.

Errors:
Code:
bash-3.2$ sh "test.sh.bkp"
ALERTDB
/u01/app/oracle/product/10.2.0.4
HELLO
 /u01/app/oracle/admin/ALERTDB/bdump
 test.sh.bkp: null directory
bash-3.2$ ./test.sh.bkp
ALERTDB
/u01/app/oracle/product/10.2.0.4
HELLO
 /u01/app/oracle/admin/ALERTDB/bdump
find: stat() error /alert_ALERTDB.log: No such file or directory
bash-3.2$

Script:

Code:
  #!/bin/ksh
NOW=${NOW:-`date '+%Y%m%d_%H%M%S'`}
export NOW
runsql()
{
MQUERY=$1
$ORACLE_HOME/bin/sqlplus -s / as sysdba << EOF
set head off feedback off verify off trimspool on
spool OUT_FILE
$MQUERY
spool off
EOF
}
if [ -f /etc/oratab ]
        then
        FILE=/etc/oratab
else
        FILE=/var/opt/oracle/oratab
fi
cat $FILE | egrep -v '^#|\*|agent|CRS|IAS|GRID|NLSN|\+ASM' | sed '/^$/d' | while read LINE
do
if [ -n $LINE ]
then
        ORACLE_SID=`echo $LINE | awk -F: '{print $1}'`; export ORACLE_SID
        ORACLE_HOME=`echo $LINE | awk -F: '{print $2}'`; export ORACLE_HOME
        PATH=$ORACLE_HOME/bin:$PATH; export PATH
        echo $ORACLE_SID;
        echo $ORACLE_HOME
        /bin/ps -fu oracle | grep -w "ora_[a-z]*_$ORACLE_SID" > /dev/null
        if [ $? = 0 ] && [ -n $ORACLE_SID ] && [ -n $ORACLE_BASE ] && [ -n $ORACLE_HOME ]
        then
        echo "HELLO"
                else
                echo "DUMMY"
 fi
fi
QUERY3="select value from v\$parameter where NAME='background_dump_dest';"
                runsql "$QUERY3"
                BDUMP_DEST=`cat $OUT_FILE | sed -e "s/[[:blank:]]//g"`
               export BDUMP_DEST
if test "$(find "$BDUMP_DEST/alert_$ORACLE_SID.log" -type f -size +5120c)"
then
echo $BDUMP_DEST
cd "$BDUMP_DEST"
        find . -name '*.gz' -mtime +90 -exec rm -f {} +
        cp "alert_$ORACLE_SID.log" "alert_$ORACLE_SID.log_${NOW}"
        gzip "alert_$ORACLE_SID.log_${NOW}"
        cat /dev/null > "alert_$ORACLE_SID.log"
        cd
fi
done



Moderator's Comments:
Mod Comment Please use CODE tags as required by forum rules!

Last edited by RudiC; 03-10-2017 at 11:09 AM.. Reason: Added CODE tags.
# 6  
Old 03-10-2017
Quote:
Originally Posted by SIMMS7400
I dont mean to hijack, but Don, does the last 'cd' above return the shell to the previous spot then? For instance, the same as what a PUSHD and POPD do in DOS?
Quote:
Originally Posted by rbatte1
A plain cd would put you in your home directory, as defined by $HOME at the time you execute it. Using cd ~ has the same effect but could be extended so you can cd ~/.ssh to change to subdirectories of whatever $HOME points to.

Perhaps you would be safer to use pushd & popd or save the current directory to a variable and explicitly change to that at the end of the section.



Robin
Hi SIMMS7400 & Robin,
As Robin said, cd ~ (which is what aksdixs's script was using), cd "$HOME", and cd all change directory to the user's home directory (unless something has unset HOME or set it to some other value).

In addition to using cd ~/directory to change to a directory in your home directory, you can also use cd ~user to change directory to the home directory of the user whose login ID is user and
Code:
cd ~user/some/directory

to change to some/directory in user's home directory. Of course, any of these may fail if user's home directory does not grant you search permission.

After a successful cd some/directory, the commands cd - and cd "$OLDPWD" will return you to the directory you were in before the previous cd command unless something has unset OLDPWD or set it to some other value). The OLDPWD variable maintained by the shell gives you one and only one level of what pushd and popd do on multiple levels in some shells (including csh and some versions of bash). But dirs, pushd, and popd are not defined by the standards and are not available in many shells.

Hope this helps,
Don
This User Gave Thanks to Don Cragun For This Post:
# 7  
Old 03-11-2017
Quote:
Originally Posted by aksdixs
Hi I am getting below error after modifying the script as told by you. I am also putting my full script here.

Errors:
Code:
bash-3.2$ sh "test.sh.bkp"
ALERTDB
/u01/app/oracle/product/10.2.0.4
HELLO
 /u01/app/oracle/admin/ALERTDB/bdump
 test.sh.bkp: null directory
bash-3.2$ ./test.sh.bkp
ALERTDB
/u01/app/oracle/product/10.2.0.4
HELLO
 /u01/app/oracle/admin/ALERTDB/bdump
find: stat() error /alert_ALERTDB.log: No such file or directory
bash-3.2$

Script:

Code:
  #!/bin/ksh
NOW=${NOW:-`date '+%Y%m%d_%H%M%S'`}
export NOW
runsql()
{
MQUERY=$1
$ORACLE_HOME/bin/sqlplus -s / as sysdba << EOF
set head off feedback off verify off trimspool on
spool OUT_FILE
$MQUERY
spool off
EOF
}
if [ -f /etc/oratab ]
        then
        FILE=/etc/oratab
else
        FILE=/var/opt/oracle/oratab
fi
cat $FILE | egrep -v '^#|\*|agent|CRS|IAS|GRID|NLSN|\+ASM' | sed '/^$/d' | while read LINE
do
if [ -n $LINE ]
then
        ORACLE_SID=`echo $LINE | awk -F: '{print $1}'`; export ORACLE_SID
        ORACLE_HOME=`echo $LINE | awk -F: '{print $2}'`; export ORACLE_HOME
        PATH=$ORACLE_HOME/bin:$PATH; export PATH
        echo $ORACLE_SID;
        echo $ORACLE_HOME
        /bin/ps -fu oracle | grep -w "ora_[a-z]*_$ORACLE_SID" > /dev/null
        if [ $? = 0 ] && [ -n $ORACLE_SID ] && [ -n $ORACLE_BASE ] && [ -n $ORACLE_HOME ]
        then
        echo "HELLO"
                else
                echo "DUMMY"
 fi
fi
QUERY3="select value from v\$parameter where NAME='background_dump_dest';"
                runsql "$QUERY3"
                BDUMP_DEST=`cat $OUT_FILE | sed -e "s/[[:blank:]]//g"`
               export BDUMP_DEST
if test "$(find "$BDUMP_DEST/alert_$ORACLE_SID.log" -type f -size +5120c)"
then
echo $BDUMP_DEST
cd "$BDUMP_DEST"
        find . -name '*.gz' -mtime +90 -exec rm -f {} +
        cp "alert_$ORACLE_SID.log" "alert_$ORACLE_SID.log_${NOW}"
        gzip "alert_$ORACLE_SID.log_${NOW}"
        cat /dev/null > "alert_$ORACLE_SID.log"
        cd
fi
done


Moderator's Comments:
Mod Comment Please use CODE tags as required by forum rules!
Please get rid of the unneeded cat (which was not there in the code I suggested). It doesn't do anything but put more load on your system and slow down your script.

And what do the diagnostics that I marked in red above tell us? They tell us that your script has set the BDUMP_DEST shell variable to an empty string! And, where did you set BDUMP_DEST? You set it with:
Code:
                BDUMP_DEST=`cat $OUT_FILE | sed -e "s/[[:blank:]]//g"`

which contains another unneeded use of cat which I would have expected would have made your script hang waiting for input. Since OUT_FILE is a shell variable that is not defined anywhere in your script, $OUT_FILE will expand to an empty string, and cat $OUT_FILE will copy what ever it reads from standard input into your sed command. Maybe you intended to use something more like:
Code:
                BDUMP_DEST=`sed -e "s/[[:blank:]]//g" OUT_FILE`

Note also that the 1st line in your script:
Code:
  #!/bin/ksh

would lead people to believe that you intend to use the Korn shell to execute your script, but with the leading spaces before the #!, that line is just a comment and has absolutely no effect in determining the shell to be used to execute your code. If you are always going to invoke your script with:
Code:
sh "test.sh.bkp"

then just get rid of that line. If you always want to use sh to run your code, change the 1st line of your script to:
Code:
#!/bin/sh

(NOTE THAT THERE ARE NO LEADING SPACES ON THIS LINE) and make it executable with:
Code:
chmod +x test.sh.bkp

and execute it using:
Code:
./test.sh.bkp

(or if the directory in which you have installed this script is in your PATH variable value, just using:
Code:
test.sh.bkp

would be sufficient).

You should also get into the habit of indenting your code so that the structure of functions, conditional code, and loops are obvious. The way you indent your code obfuscates the structure of your code and makes it much harder to comprehend what it is trying to do.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Shell script to read lines in a text file and filter user data Shell Programming and Scripting

sxsaaas (3 Replies)
Discussion started by: VikrantD
3 Replies

2. Shell Programming and Scripting

help me in Shell Scripting

Hi there please have a look at the code..i want to create Using a named pipe. Run a find in the background starting in the working directory While this is happening wait for input from the user to ask him which file to find. If the user does not enter any data in 10 seconds ask the user again.... (1 Reply)
Discussion started by: kattak1511
1 Replies

3. Shell Programming and Scripting

Shell scripting

Hi, if in a network there are lots of PCs connected with either windows or linux as operating system.Then what will be the shell script for the same and also if the PC has linux in it then we have to find if it is occupied or unoccupied. If the PC has windows in it then we have to find if it is... (6 Replies)
Discussion started by: akansha singh
6 Replies

4. UNIX for Dummies Questions & Answers

Shell Scripting

Hey I have a data in the file named as outputFile.txt. The data is in the format 123456,12345678912345,400,09/09/09,INACTIVE. I want this output without commas ie 12345612345678912345400090909INACTIVE. Please tell me what to do and clear explain all the terms, as I am new to it. (6 Replies)
Discussion started by: sampandey31
6 Replies

5. Web Development

Perl scripting or shell scripting?

i am going to study any one of the scripting languages mentioned above(shell 0r perl scripting) . Which is having more scope for a fresher? (1 Reply)
Discussion started by: Anna Hussie
1 Replies

6. What is on Your Mind?

Shell Scripting vs Perl scripting

Gents, I have been working in a Solaris/Unix environment for about 9 months. I took some linux classses online before getting the job. But, I am not very good at scripting. I want to learn how to script. Do you think that I should start with Shell scripting or Perl? I wanted to continue with... (2 Replies)
Discussion started by: Pouchie1
2 Replies

7. Android

Android Scripting Environment: Shell Scripting and Android

I just upgraded to Android 2.2 from 2.1. The GPS issue that was troublesome in 2.1 seems to have been fixed. Some of web browsing seems faster, but it could just be my connection is better today ;) Flash works in some browsers but not very good and it is too slow for Flash apps designed for... (0 Replies)
Discussion started by: Neo
0 Replies

8. What is on Your Mind?

Shell scripting vs Perl scripting

Hi all, I would like to start developping some good scripting skills. Do you think it would be best to start with shell scripting or Perl? I already got a fundation, really basics, in perl. but I am wondering what would be best to be good at first. Can you please help me determine which one to... (14 Replies)
Discussion started by: Pouchie1
14 Replies

9. Shell Programming and Scripting

Call Shell scripting from Perl Scripting.

Hi How to call a shell scripting through a Perl scripting? Actually I need some value from Shell scripting and passes in the Perl scripting. So how can i do this? (2 Replies)
Discussion started by: anupdas
2 Replies

10. Shell Programming and Scripting

difference between AIX shell scripting and Unix shell scripting.

please give the difference between AIX shell scripting and Unix shell scripting. (2 Replies)
Discussion started by: haroonec
2 Replies
Login or Register to Ask a Question