Enjoy coding
Enjoy coding

Reputation: 4366

if [ $? -ne 0 ] then syntax error then unexpected

I have been trying to execute the following UNIX shell script which is not working. I am running it by KornShell (ksh).

echo $?;
if [ $? -ne 0 ]
then
 failed $LINENO-2 $5 $6
fi
failed()
{
        echo "$0 failed at line number $1";
 echo "moving $2 to failed folder"
}

This is giving an error saying Syntax error:then unexpected.. Basically I have to check for the last executed ksh script's highest/last statement's return code and if it is not equal to zero I have to call function failed with the given parameters. I tried putting semicolon before then but that also did not work.

Can you please help?

Edit1: Based on the inputs I changed code. Still the same problem exists.

ksh ../prescript/Pre_process $1 $2 $3
rc=$?;
if [[ $rc -ne 0 ]];then
    echo "failed";
       exit 1;

Edit2: It is working for the then part by using double squared brackets. I feel I used code of bash script for ksh. I am facing problem in function call of failed. Please let me know appropriate way of function call in ksh for this example

Upvotes: 11

Views: 50559

Answers (3)

paxdiablo
paxdiablo

Reputation: 882028

You need to be careful. The first operation on $? will usually clear it so that your if won't work anyway.

You would be better off using:

rc=$?
echo $rc
if [ $rc -ne 0 ]
:

Other than that, it works fine for me:

$ grep 1 /dev/null

$ if [ $? -ne 0 ]
> then
> echo xx
> fi
xx

$ grep 1 /dev/null

$ echo $?;
1

$ if [ $? -ne 0 ]
> then
> echo yy
> fi
$ _

Note the lack of output in the last one. That's because the echo has sucked up the return value and overwritten it (since the echo was successful).

As an aside, you should let us know which UNIX and which ksh you're actually using. My working version is ksh93 under Ubuntu. Your mileage may vary if you're using a lesser version.


It looks like, from your update, your only problem now is the function call. That's most likely because you're defining it after using it. The script:

grep 1 /dev/null
rc=$?
if [ $rc -ne 0 ]
then
        failed $rc
fi

failed()
{
        echo Return code was $1
}

produces:

qq.ksh[6]: failed: not found

while:

failed()
{
        echo Return code was $1
}

grep 1 /dev/null
rc=$?
if [ $rc -ne 0 ]
then
        failed $rc
fi

produces

Return code was 1

Upvotes: 5

Jon Freedman
Jon Freedman

Reputation: 9697

This looks like bash rather than ksh

failed() {  
  echo "$0 failed at line number $1";  
  echo "moving $2 to failed folder"  
}

if [[ $? -ne 0 ]]
then
  failed $LINENO-2 $5 $6  
fi

Upvotes: 9

knittl
knittl

Reputation: 265547

you are missing semicolons at the end of the lines:

if [ $? -ne 0]; then
   # …

Upvotes: 0

Related Questions