IF tests the value of the variable expression for truth. An expression is true if it is either a non empty string or a non zero number. If the expression is true, the true-commands are executed. If it is false, and the false-commands are given, they are executed. Usually the expressions will be formed by using combinations of the following:
( exp ) ( exp1 ^^ exp2 ) ( exp1 == exp2 ) ( exp1 >= exp2 ) ( exp1 != exp2 ) ( exp1 <= exp2 ) ( exp1 > exp2 ) ( exp1 || exp2 ) ( exp1 < exp2 ) ( exp1 && exp2 )Here exp is evaluated as though it were in ${} which means that if (blah) expands the contents of $blah. Numbers are treated as constants and thus to expand $0 it must be passed to the regular parser with []. eg. if ([$0]) ...
if (!exp) is also possible which will negate a number or a string. In the other expressions, if both exp1 and exp2 expand to numbers, then the following cause true-command to be executed:
== if exp1 is equal to exp2 != if exp1 is not equal to exp2 > if exp1 is greater than exp2 < if exp1 is less than exp2 >= if exp1 is greater than or equal to exp2 <= if exp1 is less than or equal to exp2 ^^ Logical XOR of exp1 and exp2 (1 ^^ 1) == 0 (1 ^^ 0) or (0 ^^ 1) == 1 || Logical OR of exp1 and exp2 && Logical AND or exp1 and exp2
Otherwise, false-command (if present) is executed. If both exp1 and exp2 are non-numeric, then the above operations are string value comparisons. And for the logical operations A NULL string is treated as 0 with the possible exception of the ^^ operator.
To put a string in an expression it must be passed to the regular parser with []. eg if ([string1] == [string2]) .. All string comparisons are case-insensitive: so ([Hello]==[HELLO]) is true.
Examples:
if (C) { set input_prompt $C } { set -input_prompt } if (C!=0) { set input_prompt $C } { set -input_prompt }
Both of the above evaluate the same way, since $C will either expand to your current channel or 0 if none. Notice the (C) format which means that it will expand exactly like ${C}. $ expansion is always performed on the contents of an the true-commands and false commands, regardless of the setting of the INPUT_ALIASES variable.
if (USER==[ms5n]) { echo Hello Mike! } { echo Who the hell are you? }
This example will look for an assign'd variable named USER, and if found replace it and compare to ms5n. If no assign'd variable exists, it will check the environment variables for USER and return that.
if (index > max*2) { echo Limit reached }This checks the assign'd variable against the assign'd variable max times 2 and displays "Limit reached" if the first is greater than the second. It does nothing if this is not true.
if's can now be imbedded within each other. It is inconvient to write it out on a single line, so I will show the format needed in a script file.
if (time() - lasttime > 600) {
if (thud == [gone home]) { echo Bill went home over ten minutes ago echo $stime($time()) } { echo Bill is still here. }}
This will first expand the function time() and the ASSIGN'd var 'lasttime' to their current values, subtract (seconds) and see if its more than 600 seconds, (10 minutes). If that is true, then it checks to see if the assign'd var 'thud' equals the string "gone home". If that is ALSO true then it will echo "Bill went home over ten minutes ago" and the current date and time. If the second if is not true then it will display "Bill is still here.". Note there is no 'false' clause for the first if.
See Also: @ foreach while expressions