Issue with condition "if then elif else fi"

Hi everybody,

I must get trought a shell script 3 arguments.
1st argument = $1 (can take values REP1..4)
2nd argument = $2 (can take values A..Z)
3rd arguement = $3 (also can take values A...Z)

I've written this code :

#!/bin/bash
if [ $1 = "REP1" ]
then
   liste=/data/folder1
   echo "LISTEREP1 :" $liste
elif  [ $1 = "REP2" ]
then
    liste=/data/folder2
    echo "LISTEREP2 :"$liste
fi
liste_rep=$liste/$2/$3
echo "DO LOOP FOR REP1 AND REP2 : :"$1 $liste_rep
for printlist in $list_rep
do
   echo "SHOULD LOOP_"$1":" $liste_rep
done

if [ $1 = "REP3" ]
then
   liste=/data2/folder3
   echo "LISTEREP3 :" $liste
elif  [ $1 = "REP4" ]
then
    liste=/data2/folder4
    echo "LISTEREP4 :"$liste
fi
liste_rep=$liste/$2/$3
echo "DO LOOP FOR REP3 AND REP4 :"$1 $liste_rep
for printlist in $list_rep
do
   echo "SHOULD_LOOP_"$1":" $liste_rep
done
exit

The results I get for each $1 value are :

Prompt $ ./test_decomp.sh REP1 a b
LISTEREP1 : /data/folder1
DO LOOP FOR REP1 AND REP2 :REP1 /data/folder1/a/b
DO LOOP FOR REP3 AND REP4 :REP1 /data/folder1/a/b

Prompt $ ./test_decomp.sh REP2 a b
LISTEREP2 :/data/folder2
DO LOOP FOR REP1 AND REP2 :REP2 /data/folder2/a/b
DO LOOP FOR REP3 AND REP4 :REP2 /data/folder2/a/b

Prompt $ ./test_decomp.sh REP3 a b
DO LOOP FOR REP1 AND REP2 :REP3 /a/b
LISTEREP3 : /data2/folder3
DO LOOP FOR REP3 AND REP4 :REP3 /data2/folder3/a/b

Prompt $ ./test_decomp.sh REP4 a b
DO LOOP FOR REP1 AND REP2 :REP4 /a/b
LISTEREP4 :/data2/folder4
DO LOOP FOR REP3 AND REP4 :REP4 /data2/folder4/a/b

It's a mess.

My need is :

Depending on condition $1 = REP1 or REP2 it should execute
first loop
and if $1 = REP3 and REP4 should execute second loop.

But this is not the case,
Can you help?
Thanks in advance

You might want to exit the code after the first two options were completed. Or you could continue in the elif ... elif chain for all four options.
Even better would be to deploy the case ... esac construct that most shells offer.

Totally different approach would be to avoid if ... fi entirely, extract the last number (1, 2, 3 , or 4) from the respective option, and use it to control the further execution of the code.

Which shell are you using? All the shells have slightly different syntaxes which means a solution for one may not work with another.

What system are you on? This may also make a difference to a solution for your problem.

Is this homework or coursework? There is a sub-forum for that.

Andrew

I've set an exit after the 2 options were completed.
The result are below

$ ./test_decomp.sh REP1 a b
LISTEREP1 : /data/folder1
DO LOOP FOR REP1 AND REP2 :REP1 /data/folder1/a/b

$ ./test_decomp.sh REP2 a b
LISTEREP2 :/data/folder2
DO LOOP FOR REP1 AND REP2 :REP2 /data/folder2/a/b


$ ./test_decomp.sh REP3 a b
DO LOOP FOR REP1 AND REP2 :REP3 /a/b

$ ./test_decomp.sh REP4 a b
DO LOOP FOR REP1 AND REP2 :REP4 /a/b

Now when entering option 3 and 4 the result is not good.
I don't get this.
It should be simple ?!?

------ Post updated at 03:30 PM ------

Linux release Centos 6.4

Hi shellX,
Until you answer the question that Andrew asked in post #3 in this thread:

we won't be able to offer much more help!

Have you tried any of the suggestions RudiC made in post #2? (We assume that you know that inserting an exit after the first two options were completed must be done if, and only if, one of the first two options was selected and that the first loop should only be executed if on of those first two options was selected!)

First of all, an if-elif-else-fi that queries one variable (here: $1) can be more efficiently done by a case-;;-;;-esac.
Then, if the following code is similar enough for each condition, it is advisable to set variables that control the exact behavior in the following common code.
Example:

#!/bin/bash
# branch on $1, set distinct variables
case $1 in
("REP1")
    liste=/data/folder1
    text1="LISTEREP1"
    text2="REP1 AND REP2"
;;
("REP2")
    liste=/data/folder2
    text1="LISTEREP2"
    text2="REP1 AND REP2"
;;
("REP3")
    liste=/data2/folder3
    text1="LISTEREP3"
    text2="REP3 AND REP4"
;;
("REP4")
    liste=/data2/folder4
    text1="LISTEREP4"
    text2="REP3 AND REP4"
;;
(*)
    echo "unsupported argument '$1'"
    exit 1
;;
esac

# common code
echo "$text1 : $liste"
liste_rep=$liste/$2/$3
echo "DO LOOP FOR $text2 :${1}" $liste_rep
for printlist in $list_rep
do
   echo "SHOULD_LOOP_${1}:" $liste_rep
done
1 Like

Thank You.
Much better indeed.