shell script loopsFrom john@superdawg.site Mon Aug 2 23:18:42 2004 Syntax of Conditional Statements --------------------------------- The following are examples of basic syntax for conditional statements in Korn/Bash shell scripts. Some examples are quite lame and will require a good imagination, or programming skills, in order to use these in the real world. :) --------------- if statement: --------------- if [[ condition ]] then statements elif [[ condition ]] then statements else statements fi ------------------------------------- or more typically: if [[ condition ]]; then statements elif [[ condition ]]; then statements else statements fi ----------------------------------------------------------- note: the "else" and "elif" are optional, but recommended. ----------------------------------------------------------- #!/bin/ksh VAL="" # note: VAL is not set so the test below will fail. print "VAL is ${VAL}" if [ ${VAL} = YES ]; then print 'VAL is set\n' fi ------------------------------------------------ The following test works: VAL="" print "VAL is ${VAL}" if [[ ${VAL} = YES ]]; then print 'VAL is set\n' fi ------------------------------------------------ --------------- FOR statement: --------------- for item in list do statements that use $item done --------------- WHILE statement: --------------- while [[ condition ]] do statements done --------------- CASE statement: --------------- case expression in pattern1) statements;; pattern2) statements;; esac --------------- UNTIL statement: --------------- until [[ condition ]] do statements done --------------------------------------- note: a file may be created by typing: cat > filename anything typed after that will be put into that filename until you hit "ctrl D". Of course the best plan is to use vi to create a file, that way you have editing capabilities. So it's a much better practice to type: vi filename --------------------------------------- --------------------------------------- Using the "if" statement --------------------------------------- #!/bin/ksh # filename: showif # # lame example showing how to use the if statement in a script # see the following command line examples for output # # print " Showing the if statement in shell scripts" if [[ $1 = "" ]]; then print "enter at least one argument, please!" exit 1 # Exits script at this point # comments are allowed anywhere - exit 1 indicates an exit status # a "0" indicates success where any other value indicates an "error" # the exit status may be tested with the "$?" variable. fi if [[ "$#" -lt 3 ]]; then print "You entered less than three arguments!" # tests the number of the positional parameters (ex below reveals one entered) fi if [[ $1 = show ]]; then print "You asked me to show you this line" # how in the world is the user to know this? Unless of course they read the script... else print "Okay! I show you nothing." # don't you love programs with attitude? fi --------------------------------------------- -->showif Showing the if Statement in Shell Scripts You must enter at least one argument!!!! -->showif test Showing the if Statement in Shell Scripts You entered less than three arguments!! Okay! I show you nothing -->showif show the line of data Showing the if Statement in Shell Scripts You asked me to show you this line ------------------------------------------------------ ---------------------------- Using the "for" statement ---------------------------- #!/bin/ksh # filename: showfor # print "Showing the for Statement in Shell Scripts" for args in "$*" do print "The \$* argument = $args" done for args in "$@" do print "The \$@ argument = $args" done for birds in parrot robin lark do print "The bird listed = $birds" done for FILES in $(ls /etc/rc*) do print "The file listed in /etc/rc = $FILES" done ------------------------------------------------------ -->showfor this is a test | more Showing the for Statement in Shell Scripts The $* argument = this is a test The $@ argument = this The $@ argument = is The $@ argument = a The $@ argument = test The bird listed = parrot The bird listed = robin The bird listed = lark The file listed in /etc = /etc/rc0 The file listed in /etc = /etc/rc1 The file listed in /etc = /etc/rc2 The file listed in /etc = /etc/rc3 The file listed in /etc = /etc/rcS The file listed in /etc = /etc/rc.d: The file listed in /etc = /etc/rc0.d: The file listed in /etc = K00ANNOUNCE The file listed in /etc = K01DOWN The file listed in /etc = K20lp The file listed in /etc = K22acct The file listed in /etc = K28.lms The file listed in /etc = K28.snmpgtw etc...etc... ------------------------ With the for statement, each item in the list is assigned to the variable named in the for statement line. That variable may then be substituted as part of the commands of the for statement. -------------------------------------------- Using the while Statement -------------------------------------------- #!/bin/ksh # filename: showwhile # print "Showing the while Statement in Shell Scripts" let CNT=1 while ((CNT != 3)) do print "The loop count = $CNT" let CNT=CNT+1 done let CNT=1 while : do print "This is an endless loop. Count = $CNT" let CNT=CNT+1 if (( CNT == 10 )); then break fi done --------------------------------------------------- -->showwhile Showing the while Statement The loop count = 1 The loop count = 2 This is an endless loop. Count = 1 This is an endless loop. Count = 2 This is an endless loop. Count = 3 This is an endless loop. Count = 4 This is an endless loop. Count = 5 This is an endless loop. Count = 6 This is an endless loop. Count = 7 This is an endless loop. Count = 8 This is an endless loop. Count = 9 --------------------------------------- ------------------------- Using the case Statement ------------------------- #!/bin/ksh # filename: showcase # print "Showing the case Statement" if [[ $# -lt 1 ]]; then print "You Must Enter At Least One Argument" exit 1 fi for args in "$@" do case $args in 1) print "The argument must have been a 1";; 2) print "The argument must \c"; print "have been a 2";; 3) cat showcase;; *) print "I didn't understand the argument: $args";; esac done ------------------------------------------------- -->showcase 1 2 6 9 p t3st Showing the case Statement in Shell Scripts The argument must have been a 1 The argument must have been a 2 I didn't understand the argument: 6 I didn't understand the argument: 9 I didn't understand the argument: p I didn't understand the argument: t3st ------------------------------------------------- In a case statement, the '*' character is used as a default operation. If it is used, it should be the last entry in the case statement list. -------------------------- Using the until Statement -------------------------- #!/bin/ksh # filename: showuntil print "Showing the until Statement" let CNT=5 until (( CNT == 0 )) do print "The loop count = $CNT" (( CNT = CNT â^À^Ó 1 )) #instead of let CNT=CNT-1 â^À^Ó allows #whitespace in the arguments sleep 1 done print "BANG" -------------------------------------------- --> showuntil Showing the until Statement in Shell Scripts The loop count = 5 The loop count = 4 The loop count = 3 The loop count = 2 The loop count = 1 BANG ------------------------------------------------ The while conditional statement will EXECUTE the commands while the given condition is TRUE. The until conditional statement will EXECUTE the commands until the given condition is FALSE. ---------------------------------- Conditional Statements Summary ---------------------------------- The test and [ ] statements have been replaced by [[ ]]. ------------------------------------------- The conditional statement has these formats: if [ condition ] if test condition if [[ condition ]] if (( integer condition )) There are a large number of arguments available for use within the conditional statement. For example: -r file ..... True if the file exists and is readable -w file ..... True if the file exists and is writeable -x file ..... True if the file exists and is executable -f file ..... True if the file exists and is an ordinary file -d file ..... True if the file exists and is a directory -s file ..... True if the file exists and size is > zero. The following are for string [[ ]] tests: n1 -eq n2 ... True if number n1 equals n2 n1 -ne n2 ... True if number n1 not equal to n2 n1 -gt n2 ... True if number n1 greater than n2 n1 -ge n2 ... True if number n1 greater than or equal to n2 n1 -lt n2 ... True if number n1 less than n2 n1 -le n2 ... True if number n1 less than or equal to n2 -n str ...... True if str is not null (length > 0) -z str ...... True if str is null (length == 0) The following are for integer (( )) tests: n1 == n2 ... True if number n1 equals n2 n1 != n2 ... True if number n1 not equal to n2 n1 > n2 .... True if number n1 greater than n2 n1 >= n2 ... True if number n1 greater than or equal to n2 n1 < n2 .... True if number n1 less than n2 n1 <= n2 ... True if number n1 less than or equal to n2 n1 && n2 ... True if number n1 AND n2 n1 || n2 ... True if number n1 OR n2 ! .......... Logical Negation Operator && .......... Logical AND Operator || .......... Logical OR Operator ------------------------------------------------------------------------- NOTE: The Logical AND Operator has higher precedence than the OR Operator unless the condition is enclosed in parentheses. ------------------------------------------------------------------------- All operators and flags must be separated by spaces on the command line, as they are separate arguments to the command test. ------------------------------------------------------------------------- A variable which can be a null string, must be surrounded with double quotes ("..."), when compared, to separate it from 'no string at all'. e.g. The command test -s "$A" is always correct. The command -s $A will generate a syntax error message if $A is the null string, unless it is in the [[ ]] test brackets. if [ -s $file ] if [ -s "$file" ] If $file is null the command to test appears as ... if [ -s ] if [ -s "" ] The second form can be interpreted as a null string, while the first is incorrect syntax, and always evaluates to what you don't want (true). It is important to note that strings use the '=' or '!=' characters as part of the test. While numbers use the characters, -eq, -lt, etc. as part of the test, unless you are in integer context, (( )), as noted in the above tables. ------------------------- Using test Conditions ------------------------- #!/bin/ksh # filename: showtest VER="Version 1.0" #here's two ways of checking, string and integer: if (( $# < 1 )); then print "You must enter at least one argument\n" exit 1 fi #OR # #if [[ $# -lt 1 ]]; then # print "You must enter at least one argument\n" # exit 1 #fi if [[ $1 = -v || $1 = -V ]]; then print $VER exit 0 fi print "Showing test Conditions in Shell Scripts" if [[ -s $1 && ! -d $1 ]]; then print "The file $1 exists and is greater than zero" elif [[ -d $1 ]]; then print "The directory $1 exists" else print "The file or directory $1 does not exist" fi ------------------------------------------------- -->showtest You must enter at least one argument -->showtest -v Version 1.0 -->showtest -V Version 1.0 -->showtest /usr/bin/who Showing test Conditions in Shell Scripts The file /usr/bin/who exists and is greater than zero -->showtest /bin Showing test Conditions in Shell Scripts The directory /bin exists -->showtest bird Showing test Conditions in Shell Scripts The file or directory bird does not exist $showtest v Showing test Conditions in Shell Scripts The file or directory v does not exist --------------------------------------------------- The first if statement tests the number of positional parameter entered. If the number is less than 1, meaning that no arguments were entered, then the script informs the operator of the error and exits. The second if statement tests for the string values of '-v' and '-V'. If the entry matches one of these strings, the version number of the show_test script is displayed. The third if statement tests to see if the file ($1) exists AND is not a directory. You have to remember that directories in the system are also files. Therefore, without the second test condition the script would have determined that directories are files, displayed that the file exists and is greater than zero and completed the script. The fourth if statement is used to test for the argument being a directory if it is not a regular file. If the argument is a directory then it indicates this. If the argument is not a file or directory then it indicates that it is neither a file or directory and completes. --------------------------------------- Using a read Statement for User Input --------------------------------------- #!/bin/ksh # filename: showread VER="Version 1.0" if [[ $1 = '-v' || $1 = '-V' ]]; then print $VER exit 0 fi print "Showing the read Statement in Shell Scripts\n" while : do print "Enter a file/directory name or 'QUIT' to exit: \c" read answer if [[ -z $answer ]]; then continue fi if [[ $answer = 'quit' || $answer = 'QUIT' ]]; then break fi if [[ -f $answer ]]; then print "$answer is a regular file in the system" elif [[ -d $answer ]]; then print "$answer is a directory in the system" else print "$answer is not a file or directory in the system" fi done -------------------------------------------------------- -->showread Showing the read Statement in Shell Scripts Enter a file/directory name or 'QUIT' to exit: /bin/ls /bin/ls is a regular file in the system Enter a file/directory name or 'QUIT' to exit: /bin/ksh /bin/ksh is a regular file in the system Enter a file/directory name or 'QUIT' to exit: /foobar /foobar is not a file or directory in the system Enter a file/directory name or 'QUIT' to exit: /home/test /home/test is a directory in the system Enter a file/directory name or 'QUIT' to exit: QUIT --------------------------------------------------------------- #!/bin/ksh # Example script: Used for formatting a number of floppy disks # performs a loop to format a number of diskettes. Note the # regular expression in the while test condition â^À^Ó it matches # either y or Y ANSWER='y' while [[ $ANSWER = @(y|Y) ]] do print "Formatting - please be patient\n" format /dev/mf0 if [ $? -ne 0 ]; then print "Problem with disk \n" print "Insert another disk and press y to continue\n" print "Or press other key to exit" read ANSWER continue else print "Do you wish to format another y/n?\n" read ANSWER continue fi done ----------------------------------------------------- #!/bin/ksh # filename: select ############################################################# # # This shows how to use the select option of the KORN Shell # ############################################################# print "\n" #Just for readability PS3=$(print "\nPlease enter a number: ") #Wanted the newline select cmd in date pwd ls quit do case $cmd in date | pwd | ls) print \ "\nYou selected: $REPLY which was: $cmd";; quit) print "\nYou selected: $REPLY which was: $cmd\n"; break;; *) print "\nYour selection was out of range\n";; esac done ------------------------------------------------------------ Arrays are one dimensional and are of the format variable[subscript]. The subscript must evaluate to a number in the range of 0-1023. ------------ Using Arrays ------------ #!/bin/ksh # filename: arrays integer CNT=0 # Arrays start with zero and declare cnt being # an integer for data in This is a test of this beast do text[CNT]=$data CNT=CNT+1 #let and $CNT not required for integer values done integer DISP=0 #Display Value until [[ $CNT < 0 ]] do print "The data stored was: ${text[DISP]}" CNT=CNT-1 (( DISP = DISP + 1 )) #need (( )) for spaces in expr done # Show what happens when you reference an array without # subscript print "\nThe first data stored was: ${text}\n" # The characters * and @ can be used to access all data # print "Data Stored: ${text[*]}\n" # Show difference of * and @ when inside of quotes # for data in "${text[*]}" do print "[*]: $data\n" done for data in "${text[@]}" do print "[@]: $data" done ------------------------------------------------ The KORN shell provides an elif command as part of an if statement that is similar to the elseif statement in other languages. It is a short cut to doing an else statement followed by an if statement. Similar to the if statements, a then must follow for the elif statements. Remember, if you are testing one argument for a number of values, it is better to do a case statement rather than a series of if statements. ----------------------- Using the elif Command ----------------------- #!/bin/ksh PS3=$(print "\nPlease enter a number: ") #Wanted the newline select cmd in date pwd ls quit do if [[ $cmd = date ]]; then print "You selected: $REPLY which was: date\n" elif [[ $cmd = pwd ]]; then print "You selected: $REPLY which was: pwd\n" elif [[ $cmd = ls ]]; then print "You selected: $REPLY which was: ls\n" elif [[ $cmd = quit ]]; then print "You selected: $REPLY which was: quit\n" break else print "Your selection was out of range\n" fi done -------------------------------------------------- |
The Art of Linux System Administration published by O'Reilly Media Study Guide for the LPIC-2 Certification Exams |
Wagoneers FULL SIZE JEEPS JeepMeister "Jeep is America's -Enzo Ferrari MeisterTech Diesels + |
One Page Overview of Linux Commands click for an image of the 5 essential Linux commands An Intro to Linux |
at Midway Auto on SR9 in Snohomish, or at Northland Diesel in Bellingham, WA |