ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
As konsolebox already pointed out, the case/esac construct does not work that way in bash. If you're not stuck with case, you can try a different approach like this
Code:
#!/bin/bash
pattern=1
limit=4
while [ $pattern -le $limit ]
do
printf "$pattern"
pattern=$((pattern + 1))
done
echo
Anyway, what are you trying to achieve? Will pattern be always numeric?
Edit: the same result can be achieved in recent bash with a single piped statement, as
Code:
echo {1..4} | sed 's/ //g'
but again it depends on what you're trying to achieve.
1) echo " statements for pattern 1 match will be executed \n "
;;
2) echo " statements for patter 2 match will be executed \n"
;;
3) echo " statement for patter 3 match will be executed "
;;
esac;
now how do I make this script print
Statement for pattern 1 match will be executed
Statement for pattern 2 match will be executed
when the patther=1
i.e when I give patter=1 then two cases should be executed 1 and 2 Like in C language switch() case statements.
You dont give a break; statements the statements gets executed for the perticular case untill a break is found.
if I give
switch(var1)
{
case 1: printf(" Statement for pattern 1 match will be executed") ;
case 2: printf ("Statement for pattern 2 match will be executed ") ;
break;
case 3: printf ("Statement for pattern 3 match will be executed ") ;
break ;
}
I achive what I want from the above C snippet. I want to achive the same in shell script.
What I am seeing here is you wanting the BASH "case" construct to work the same as the C "switch"---and several people telling you that it is different. Have you looked this up in the Advanced Bash Scripting Guide (ABS)? ...free at http://tldp.org
The case statement is inside a while loop which will be executed until the pattern is equal to a keyword (BREAK). At each matching condition the pattern is updated to the next one. In this way the test is repeated and the result is exactly what you're trying to get. Note that you can insert BREAK at any point in the case construct.
In place of ;; we can use ;& (unconditional follow up) and ;;& (conditional follow up). So, the following will print 12, if the pattern is 1 and will print 2, if the pattern is 2.
case $pattern in
1)
echo "1"
;&
2)
echo "2"
;;
esac
Though this is an old thread, the answer may help others. Credit goes to my boss who found it for me from bash man page.
Another point to note. I think it is a new feature in the newer versions of bash. I'm sure this would not have been existing back in 2008. Though I dont have when this feature got into bash but I can say that bash-3.0 dint have it.
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.