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.
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 ?!?
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