Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 10
Introduction
Making decision is important part in ONCE life as well as in computers logical
driven program. In fact logic is not LOGIC until you use decision making. This chapter introduces to the bash's structured language constructs such as: Decision making Loops Is there any difference making decision in Real life and with Computers? Well real life decision are quite complicated to all of us and computers even don't have that much power to understand our real life decisions. What computer know is 0 (zero) and 1 that is Yes or No. To make this idea clear, lets play some game (WOW!) with bc - Linux calculator program. $ bc After this command bc is started and waiting for your commands, i.e. give it some calculation as follows type 5 + 2 as: 5 + 2 7 7 is response of bc i.e. addition of 5 + 2 you can even try 5 - 2 5 / 2 See what happened if you type 5 > 2 as follows 5 > 2 1 1 (One?) is response of bc, How? bc compare 5 with 2 as, Is 5 is greater then 2, (If I ask same question to you, your answer will be YES), bc gives this 'YES' answer by showing 1 value. Now try 5 < 2 0 0 (Zero) indicates the false i.e. Is 5 is less than 2?, Your answer will be no which is indicated by bc by showing 0 (Zero). Remember in bc, relational expression always returns true (1) or false (0 - zero). Try following in bc to clear your Idea and not down bc's response 5 > 12 5 == 10 5 != 2 5 == 5 12 < 2 Expression Meaning to us Your Answer BC's Response 5 > 12 Is 5 greater than 12 NO 0 5 == 10 Is 5 is equal to 10 NO 0 5 != 2 Is 5 is NOT equal to 2 YES 1 LSST v1.05r3 > Chapter 3 > Introducation http://www.cyberciti.biz/pdf/lsst/ch03.html (1 of 2) [7/29/2002 6:52:15 PM] 5 == 5 Is 5 is equal to 5 YES 1 1 < 2 Is 1 is less than 2 Yes 1 It means when ever there is any type of comparison in Linux Shell It gives only two answer one is YES and NO is other. In Linux Shell Value Meaning Example Zero Value (0) Yes/True 0 NON-ZERO Value No/False -1, 32, 55 anything but not zero Remember both bc and Linux Shell uses different ways to show True/False values Value Shown in bc as Shown in Linux Shell as True/Yes 1 0 False/No 0 Non - zero value Prev Home Next Linux Command(s) Related with Process Up if condition LSST v1.05r3 > Chapter 3 > Introducation http://www.cyberciti.biz/pdf/lsst/ch03.html (2 of 2) [7/29/2002 6:52:15 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next if condition if condition which is used for decision making in shell script, If given condition is true then command1 is executed. Syntax: Condition is defined as: "Condition is nothing but comparison between two values." For compression you can use test or [ expr ] statements or even exist status can be also used. Expreession is defined as: "An expression is nothing but combination of values, relational operator (such as >,<, <> etc) and mathematical operators (such as +, -, / etc )." Following are all examples of expression: 5 > 2 3 + 6 3 * 65 a < b c > 5 c > 5 + 30 -1 Type following commands (assumes you have file called foo) $ cat foo $ echo $? The cat command return zero(0) i.e. exit status, on successful, this can be used, in if condition as follows, Write shell script as LSST v1.05r3 > Chapter 3 > if condition http://www.cyberciti.biz/pdf/lsst/ch03sec01.html (1 of 3) [7/29/2002 6:52:16 PM] Run above script as: $ chmod 755 showfile $./showfile foo Shell script name is showfile ($0) and foo is argument (which is $1).Then shell compare it as follows: if cat $1 which is expanded to if cat foo. Detailed explanation if cat command finds foo file and if its successfully shown on screen, it means our cat command is successful and its exist status is 0 (indicates success), So our if condition is also true and hence statement echo -e "\n\nFile $1, found and successfully echoed" is proceed by shell. Now if cat command is not successful then it returns non-zero value (indicates some sort of failure) and this statement echo -e "\n\nFile $1, found and successfully echoed" is skipped by our shell. Exercise Write shell script as follows: Press Ctrl + d to save $ chmod 755 trmif Answer the following question in referance to above script: (A) foo file exists on your disk and you give command, $ ./trmfi foo what will be output? (B) If bar file not present on your disk and you give command, $ ./trmfi bar what will be output? (C) And if you type $ ./trmfi What will be output? For Answer click here. Prev Home Next LSST v1.05r3 > Chapter 3 > if condition http://www.cyberciti.biz/pdf/lsst/ch03sec01.html (2 of 3) [7/29/2002 6:52:16 PM] Shells (bash) structured Language Constructs Up test command or [ expr ] LSST v1.05r3 > Chapter 3 > if condition http://www.cyberciti.biz/pdf/lsst/ch03sec01.html (3 of 3) [7/29/2002 6:52:16 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next test command or [ expr ] test command or [ expr ] is used to see if an expression is true, and if it is true it return zero(0), otherwise returns nonzero for false. Syntax: test expression OR [ expression ] Example: Following script determine whether given argument number is positive. Run it as follows $ chmod 755 ispostive $ ispostive 5 5 number is positive $ispostive -45 Nothing is printed $ispostive ./ispostive: test: -gt: unary operator expected Detailed explanation The line, if test $1 -gt 0 , test to see if first command line argument($1) is greater than 0. If it is true(0) then test will return 0 and output will printed as 5 number is positive but for -45 argument there is no output because our condition is not true(0) (no -45 is not greater than 0) hence echo statement is skipped. And for last statement we have not supplied any argument hence error ./ispostive: test: -gt: unary operator expected, is generated by shell , to avoid such error we can test whether command line argument is supplied or not. test or [ expr ] works with 1.Integer ( Number without decimal point) 2.File types 3.Character strings LSST v1.05r3 > Chapter 3 > test command or [ expr ] http://www.cyberciti.biz/pdf/lsst/ch03sec02.html (1 of 3) [7/29/2002 6:52:17 PM] For Mathematics, use following operator in Shell Script Mathematical Operator in Shell Script Meaning Normal Arithmetical/ Mathematical Statements But in Shell For test statement with if command For [ expr ] statement with if command -eq is equal to 5 == 6 if test 5 -eq 6 if [ 5 -eq 6 ] -ne is not equal to 5 != 6 if test 5 -ne 6 if [ 5 -ne 6 ] -lt is less than 5 < 6 if test 5 -lt 6 if [ 5 -lt 6 ] -le is less than or equal to 5 <= 6 if test 5 -le 6 if [ 5 -le 6 ] -gt is greater than 5 > 6 if test 5 -gt 6 if [ 5 -gt 6 ] -ge is greater than or equal to 5 >= 6 if test 5 -ge 6 if [ 5 -ge 6 ] NOTE: == is equal, != is not equal. For string Comparisons use Operator Meaning string1 = string2 string1 is equal to string2 string1 != string2 string1 is NOT equal to string2 string1 string1 is NOT NULL or not defined -n string1 string1 is NOT NULL and does exist -z string1 string1 is NULL and does exist Shell also test for file and directory types Test Meaning -s file Non empty file -f file Is File exist or normal file and not a directory -d dir Is Directory exist and not a file -w file Is writeable file -r file Is read-only file -x file Is file is executable Logical Operators Logical operators are used to combine two or more condition at a time Operator Meaning ! expression Logical NOT expression1 -a expression2 Logical AND LSST v1.05r3 > Chapter 3 > test command or [ expr ] http://www.cyberciti.biz/pdf/lsst/ch03sec02.html (2 of 3) [7/29/2002 6:52:17 PM] expression1 -o expression2 Logical OR Prev Home Next Decision making in shell script ( i.e. if command) Up if...else...fi LSST v1.05r3 > Chapter 3 > test command or [ expr ] http://www.cyberciti.biz/pdf/lsst/ch03sec02.html (3 of 3) [7/29/2002 6:52:17 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next if...else...fi If given condition is true then command1 is executed otherwise command2 is executed. Syntax: For e.g. Write Script as follows: Try it as follows: $ chmod 755 isnump_n $ isnump_n 5 5 number is positive $ isnump_n -45 LSST v1.05r3 > Chapter 3 > if...else...fi http://www.cyberciti.biz/pdf/lsst/ch03sec03.html (1 of 4) [7/29/2002 6:52:18 PM] -45 number is negative $ isnump_n ./ispos_n : You must give/supply one integers $ isnump_n 0 0 number is negative Detailed explanation First script checks whether command line argument is given or not, if not given then it print error message as "./ispos_n : You must give/supply one integers". if statement checks whether number of argument ($#) passed to script is not equal (-eq) to 0, if we passed any argument to script then this if statement is false and if no command line argument is given then this if statement is true. The echo command i.e. echo "$0 : You must give/supply one integers" | | | | 1 2 1 will print Name of script 2 will print this error message And finally statement exit 1 causes normal program termination with exit status 1 (nonzero means script is not successfully run). The last sample run $ isnump_n 0 , gives output as "0 number is negative", because given argument is not > 0, hence condition is false and it's taken as negative number. To avoid this replace second if statement with if test $1 -ge 0. Nested if-else-fi You can write the entire if-else construct within either the body of the if statement of the body of an else statement. This is called the nesting of ifs. LSST v1.05r3 > Chapter 3 > if...else...fi http://www.cyberciti.biz/pdf/lsst/ch03sec03.html (2 of 4) [7/29/2002 6:52:18 PM] Run the above shell script as follows: $ chmod +x nestedif.sh $ ./nestedif.sh 1. Unix (Sun Os) 2. Linux (Red Hat) Select you os choice [1 or 2]? 1 You Pick up Unix (Sun Os) $ ./nestedif.sh 1. Unix (Sun Os) 2. Linux (Red Hat) Select you os choice [1 or 2]? 2 You Pick up Linux (Red Hat) $ ./nestedif.sh 1. Unix (Sun Os) 2. Linux (Red Hat) Select you os choice [1 or 2]? 3 What you don't like Unix/Linux OS. Note that Second if-else constuct is nested in the first else statement. If the condition in the first if statement is false the the condition in the second if statement is checked. If it is false as well the final else statement is executed. You can use the nested ifs as follows also: Syntax: LSST v1.05r3 > Chapter 3 > if...else...fi http://www.cyberciti.biz/pdf/lsst/ch03sec03.html (3 of 4) [7/29/2002 6:52:18 PM] Prev Home Next test command or [ expr ] Up Multilevel if-then-else LSST v1.05r3 > Chapter 3 > if...else...fi http://www.cyberciti.biz/pdf/lsst/ch03sec03.html (4 of 4) [7/29/2002 6:52:18 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next Multilevel if-then-else Syntax: For multilevel if-then-else statement try the following script: Try above script as follows: $ chmod 755 elf $ ./elf 1 $ ./elf -2 $ ./elf 0 $ ./elf a Here o/p for last sample run: ./elf: [: -gt: unary operator expected ./elf: [: -lt: unary operator expected ./elf: [: -eq: unary operator expected Opps! a is not number, give number LSST v1.05r3 > Chapter 3 > Multilevel if-then-else http://www.cyberciti.biz/pdf/lsst/ch03sec04.html (1 of 2) [7/29/2002 6:52:19 PM] Above program gives error for last run, here integer comparison is expected therefore error like "./elf: [: -gt: unary operator expected" occurs, but still our program notify this error to user by providing message "Opps! a is not number, give number". Prev Home Next if...else...fi Up Loops in Shell Scripts LSST v1.05r3 > Chapter 3 > Multilevel if-then-else http://www.cyberciti.biz/pdf/lsst/ch03sec04.html (2 of 2) [7/29/2002 6:52:19 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next Loops in Shell Scripts Loop defined as: "Computer can repeat particular instruction again and again, until particular condition satisfies. A group of instruction that is executed repeatedly is called a loop." Bash supports: for loop while loop Note that in each and every loop, (a) First, the variable used in loop condition must be initialized, then execution of the loop begins. (b) A test (condition) is made at the beginning of each iteration. (c) The body of loop ends with a statement that modifies the value of the test (condition) variable. Prev Home Next Multilevel if-then-else Up for loop LSST v1.05r3 > Chapter 3 > Loops in Shell Scripts http://www.cyberciti.biz/pdf/lsst/ch03sec05.html [7/29/2002 6:52:23 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next for Loop Syntax: Before try to understand above syntax try the following script: Run it above script as follows: $ chmod +x testfor $ ./testfor The for loop first creates i variable and assigned a number to i from the list of number from 1 to 5, The shell execute echo statement for each assignment of i. (This is usually know as iteration) This process will continue until all the items in the list were not finished, because of this it will repeat 5 echo statements. To make you idea more clear try following script: Save above script and run it as: $ chmod 755 mtable $ ./mtable 7 $ ./mtable For first run, above script print multiplication table of given number where i = 1,2 ... 10 is multiply by given n (here LSST v1.05r3 > Chapter 3 > for Loop http://www.cyberciti.biz/pdf/lsst/ch03sec06.html (1 of 5) [7/29/2002 6:52:26 PM] command line argument 7) in order to produce multiplication table as 7 * 1 = 7 7 * 2 = 14 ... .. 7 * 10 = 70 And for second test run, it will print message - Error - Number missing form command line argument Syntax : ./mtable number Use to print multiplication table for given number This happened because we have not supplied given number for which we want multiplication table, Hence script is showing Error message, Syntax and usage of our script. This is good idea if our program takes some argument, let the user know what is use of the script and how to used the script. Note that to terminate our script we used 'exit 1' command which takes 1 as argument (1 indicates error and therefore script is terminated) Even you can use following syntax: Syntax: In above syntax BEFORE the first iteration, expr1 is evaluated. This is usually used to initialize variables for the loop. All the statements between do and done is executed repeatedly UNTIL the value of expr2 is TRUE. AFTER each iteration of the loop, expr3 is evaluated. This is usually use to increment a loop counter. $ cat > for2 for (( i = 0 ; i <= 5; i++ )) do echo "Welcome $i times" done Run the above script as follows: $ chmod +x for2 $ ./for2 Welcome 0 times Welcome 1 times Welcome 2 times Welcome 3 times Welcome 4 times Welcome 5 times In above example, first expression (i = 0), is used to set the value variable i to zero. Second expression is condition i.e. all statements between do and done executed as long as expression 2 (i.e continue as long as the value of variable i is less than or equel to 5) is TRUE. Last expression i++ increments the value of i by 1 i.e. it's equivalent to i = i + 1 statement. LSST v1.05r3 > Chapter 3 > for Loop http://www.cyberciti.biz/pdf/lsst/ch03sec06.html (2 of 5) [7/29/2002 6:52:26 PM] Nesting of for Loop As you see the if statement can nested, similarly loop statement can be nested. You can nest the for loop. To understand the nesting of for loop see the following shell script. Run the above script as follows: $ chmod +x nestedfor.sh $ ./nestefor.sh 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 Here, for each value of i the inner loop is cycled through 5 times, with the varible j taking values from 1 to 5. The inner for loop terminates when the value of j exceeds 5, and the outer loop terminets when the value of i exceeds 5. Following script is quite intresting, it prints the chess board on screen. Run the above script as follows: $ chmod +x chessboard $ ./chessboard LSST v1.05r3 > Chapter 3 > for Loop http://www.cyberciti.biz/pdf/lsst/ch03sec06.html (3 of 5) [7/29/2002 6:52:26 PM] On my terminal above script produec the output as follows: Above shell script cab be explained as follows: Command(s)/Statements Explanation for (( i = 1; i <= 9; i++ )) do Begin the outer loop which runs 9 times., and the outer loop terminets when the value of i exceeds 9 for (( j = 1 ; j <= 9; j++ )) do Begins the inner loop, for each value of i the inner loop is cycled through 9 times, with the varible j taking values from 1 to 9. The inner for loop terminates when the value of j exceeds 9. tot=`expr $i + $j` tmp=`expr $tot % 2` See for even and odd number positions using these statements. if [ $tmp -eq 0 ]; then echo -e -n "\033[47m " else echo -e -n "\033[40m " fi If even number posiotion print the white colour block (using echo -e -n "\033[47m " statement); otherwise for odd postion print the black colour box (using echo -e -n "\033[40m " statement). This statements are responsible to print entier chess board on screen with alternet colours. done End of inner loop echo -e -n "\033[40m" Make sure its black background as we always have on our terminals. echo "" Print the blank line done End of outer loop and shell scripts get terminted by printing the chess board. Exercise Try to understand the shell scripts (for loops) shown in exercise chapter. LSST v1.05r3 > Chapter 3 > for Loop http://www.cyberciti.biz/pdf/lsst/ch03sec06.html (4 of 5) [7/29/2002 6:52:26 PM] Prev Home Next Loops in Shell Scripts Up while loop LSST v1.05r3 > Chapter 3 > for Loop http://www.cyberciti.biz/pdf/lsst/ch03sec06.html (5 of 5) [7/29/2002 6:52:26 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next while loop Syntax: Loop is executed as long as given condition is true. For e.g.. Above for loop program (shown in last section of for loop) can be written using while loop as: Save it and try as $ chmod 755 nt1 $./nt1 7 Above loop can be explained as follows: LSST v1.05r3 > Chapter 3 > The case Statement http://www.cyberciti.biz/pdf/lsst/ch03sec07.html (1 of 2) [7/29/2002 6:52:28 PM] n=$1 Set the value of command line argument to variable n. (Here it's set to 7 ) i=1 Set variable i to 1 while [ $i -le 10 ] This is our loop condition, here if value of i is less than 10 then, shell execute all statements between do and done do Start loop echo "$n * $i = `expr $i \* $n`" Print multiplication table as 7 * 1 = 7 7 * 2 = 14 .... 7 * 10 = 70, Here each time value of variable n is multiply be i. i=`expr $i + 1` Increment i by 1 and store result to i. ( i.e. i=i+1) Caution: If you ignore (remove) this statement than our loop become infinite loop because value of variable i always remain less than 10 and program will only output 7 * 1 = 7 ... ... E (infinite times) done Loop stops here if i is not less than 10 i.e. condition of loop is not true. Hence loop is terminated. Prev Home Next for loop Up The case Statement LSST v1.05r3 > Chapter 3 > The case Statement http://www.cyberciti.biz/pdf/lsst/ch03sec07.html (2 of 2) [7/29/2002 6:52:28 PM] Linux Shell Scripting Tutorial (LSST) v1.05r3 Prev Chapter 3: Shells (bash) structured Language Constructs Next The case Statement The case statement is good alternative to Multilevel if-then-else-fi statement. It enable you to match several values against one variable. Its easier to read and write. Syntax: The $variable-name is compared against the patterns until a match is found. The shell then executes all the statements up to the two semicolons that are next to each other. The default is *) and its executed if no match is found. For e.g. write script as follows: LSST v1.05r3 > Chapter 3 > The case Statement http://www.cyberciti.biz/pdf/lsst/ch03sec08.html (1 of 2) [7/29/2002 6:52:32 PM] Save it by pressing CTRL+D and run it as follows: $ chmod +x car $ car van $ car car $ car Maruti-800 First script will check, that if $1(first command line argument) is given or not, if NOT given set value of rental variable to "*** Unknown vehicle ***",if command line arg is supplied/given set value of rental variable to given value (command line arg). The $rental is compared against the patterns until a match is found. For first test run its match with van and it will show output "For van Rs.10 per k/m." For second test run it print, "For car Rs.20 per k/m". And for last run, there is no match for Maruti-800, hence default i.e. *) is executed and it prints, "Sorry, I can not gat a Maruti-800 for you". Note that esac is always required to indicate end of case statement. See the one more example of case statement in chapter 4 of section shift command. Prev Home Next while loop Up How to de-bug the shell script? LSST v1.05r3 > Chapter 3 > The case Statement http://www.cyberciti.biz/pdf/lsst/ch03sec08.html (2 of 2) [7/29/2002 6:52:32 PM]
Complete Download (Ebook) Starting out with C++. From control structures through objects by Tony Gaddis ISBN 9781323767498, 1323767495 PDF All Chapters
Complete Download (Ebook) Starting out with C++. From control structures through objects by Tony Gaddis ISBN 9781323767498, 1323767495 PDF All Chapters