|
|
1.1 ! root 1: .TI CSHELL/EXPRESSIONS ! 2: Expressions: Arithmetic, Logic Operations, and Decisions [DRAFT] ! 3: ! 4: ! 5: An expression is a group of words (numbers, strings, and ! 6: operators separated by spaces) which the C shell ! 7: replaces by a single number, called its value. ! 8: The act of replacing an expression by its value ! 9: is a kind of substitution called evaluation, and forms the ! 10: basis for all arithmetic, logic operations, and decisions. ! 11: Loosely speaking, the term "expression" applies to any construct ! 12: whatever in the C shell, but here it has a specific sense. ! 13: ! 14: Expressions are only evaluated, hence useful, ! 15: in conjunction with four built-in commands: ! 16: .IP ! 17: .nf ! 18: \fBif (\fIexpression\fP) then ! 19: \fBwhile (\fIexpression\fP) ! 20: \fB@ \fIname\fP = (\fIexpression\fP) ! 21: exit (\fIexpression\fP)\fR ! 22: .fi ! 23: .LP ! 24: The if and while statements use the value of \fIexpression\fP ! 25: to determine whether to execute the next command or group of commands. ! 26: In particular, when the C shell produces a value of zero (false), ! 27: the next group of commands is not done; otherwise it is done. ! 28: The \fB@\fP command (yes, it is actually a command), ! 29: not to be confused with the "at" command or the old default ! 30: line-kill character, stores the value of \fIexpression\fP ! 31: in the variable \fIname\fP. ! 32: Except for providing the only way to store the results of an ! 33: arithmetic or logic computation, it is identical to the "set" command. ! 34: The exit command quits the current shell (e.g., in a script) ! 35: and sets the command completion status (which other programs ! 36: sometimes want to know) with the value of \fIexpression\fP. ! 37: ! 38: The command forms above do not all require parentheses, ! 39: but including them always is probably a good practice. ! 40: Moreover, the words inside an expression generally require spaces ! 41: between each other. ! 42: These words ultimately consist of strings (such as filenames), ! 43: numbers (such as 3.1415), and operators (such as +, \-, <, and >). ! 44: Usually, however, you have entered some of the words as ! 45: references to variable values, and so the shell will provide ! 46: the actual values during variable substitution just prior ! 47: to evaluating the expression. ! 48: ! 49: The C shell has two main kinds of expressions: arithmetic and logic. ! 50: Of logic expressions it has three kinds: boolean, file enquiry, ! 51: and command status enquiry. ! 52: Each category is described below. ! 53: ! 54: Arithmetic Expressions ! 55: ! 56: Here evaluation simply means doing the arithmetic indicated, ! 57: and the value that replaces the expression is just the result. ! 58: You may use any of the operators and precedences valid in the ! 59: C programming language (without tremendously reliable results), ! 60: and octal numbers must begin with a 0. ! 61: The only numbers recognized by the shell are integers. ! 62: ! 63: In the following examples, suppose ! 64: we have issued "% set y = 8 ; set num = (4 168 10 8808)": ! 65: ! 66: .nf ! 67: EXPRESSION VALUE EXPRESSION VALUE ! 68: (2 + 2) 4 (5 - 27 + 7) -15 ! 69: (3 + $y + $num[3]) 21 ($num[4] - 5) 8803 ! 70: (5 * 5) 25 (24 / $y - 6) -3 ! 71: ! 72: % @ x = (354 - 128 + 52 * 5 / 3) ! 73: % echo Result is $x ! 74: Result is 174 ! 75: % set y = (354 - 128 + 52 / 3) ! 76: % echo Result is $y ! 77: Result is 354 - 128 + 52 / 3 ! 78: .fi ! 79: ! 80: ! 81: Logic Expressions ! 82: ! 83: Evaluation means asking the question "Is it true that \fIexpression\fP?", ! 84: where \fIexpression\fP is a statement or assertion phrased in C Shell terms. ! 85: The value replacing it is 1 if the statement is true, 0 if false. ! 86: There are three kinds of logic expressions: boolean, file enquiry, ! 87: and command status enquiry. ! 88: Any nonzero valued expression is taken as true, whatever you ! 89: may have intended (e.g., (3 + 2) is both 5 and true). ! 90: ! 91: Boolean Expressions ! 92: ! 93: These expressions, named after the English mathematician George Boole, ! 94: make assertions about the relative sizes of two numbers. There are ! 95: 8 kinds of assertions, ! 96: ! 97: .nf ! 98: == literal equals != literal not-equals ! 99: =~ regular expr. equals !~ regular expr. not equals ! 100: > greater than < less than ! 101: >= > or = <= < or =, ! 102: ! 103: 2 ways to combine two assertions, ! 104: ! 105: && and || or ! 106: ! 107: and one way to negate an assertion ! 108: ! 109: ! not ! 110: ! 111: Here are some examples: ! 112: ! 113: EXPRESSION VALUE EXPRESSION VALUE ! 114: (3 > 2) 1 (-5 < $num[3]) 1 ! 115: (234 <= 234) 1 (234 <= 233) 0 ! 116: (2 == $y || 3 > 2) 1 (1 > -8 && 3 > 1) 1 ! 117: (1) 1 (2 + (5 == 5)) 3 ! 118: (prog.c == *.c) 0 (prog.c =~ *.c) 1 ! 119: ! 120: % set x = 340 ! 121: % if ($x > 200) echo You cannot afford it. ! 122: You cannot afford it. ! 123: .fi ! 124: ! 125: File Enquiry Expressions ! 126: ! 127: These have the form (-L \fIfilename\fP), where the `L' specifies one of ! 128: 8 different assertions about \fIfilename\fP. ! 129: You may employ these to have the shell determine whether or not ! 130: permission is granted for a certain file, whether it is a directory, etc. ! 131: The possible choices for `L' are: ! 132: ! 133: .nf ! 134: r read access o ownership ! 135: w write access z zero size ! 136: x execute access f plain file ! 137: e existence d directory ! 138: ! 139: Here are some examples. ! 140: ! 141: % if (! -z /usr/spool/mail/jak) echo You have mail. ! 142: You have mail. ! 143: % if (! -z netcopy.out) echo ready ! 144: % if (! -e stuff) echo Not executable ! 145: .fi ! 146: ! 147: Command Status Expressions ! 148: ! 149: These have the form ( { \fIcommand\fP } ), where the shell ! 150: executes \fIcommand\fP during evaluation, and uses the ! 151: completion status as the value of the variable. ! 152: Note the spaces between \fIcommand\fP and the {}'s. ! 153: Unlike command substitution, nothing special happens to ! 154: the output of \fIcommand\fP. ! 155: In fact, frequently you do not need output anyway since ! 156: the expression relies upon the return status. ! 157: In the examples below the \-s option ! 158: suppresses any printed output in both cases. ! 159: ! 160: For instance, to take a certain action in case two files differ, ! 161: ! 162: if ( { cmp -s file1 file2 } ) then ... ! 163: ! 164: or to leave a script and let the calling process know ! 165: of a match for a string in a file, ! 166: ! 167: exit ( { grep -s string file } ) ! 168: ! 169: ! 170: jak
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.