== Boolean Truth == A **boolean [[expression]]** has only two outcomes: **true** or **false**. In [[awk]], [[expression]]s that evaluate to the numeric value 0 or to the empty string are false. The rest is true. **There is not keyword for true or false** in awk. This is a [[pitfall]] because true is a valid variable name that is initialized to 0 or "" and thus awk will not complain: {{{ sh $ awk 'BEGIN{if (true) {print "true"} else {print "false"}}' false }}} | **Value** | **True/False** | 0 | false | 1 | true | -1 | true | "abc" | true | "0" | true. it's a non null string, but see below. | "" | false | " " | true a space is still a char === The problems with 0, 00, "0", " 0".... The behaviour of awk when a string contains only zeros can be ambiguous, and may even vary depending on which version of awk is being used. ==== Taking zero from the data source If a value of "0" or "000" or " 00", is taken from the data source, then awk considers this to be a numeric value and it evaluates to false . The following example shows $1 using a zero value taken from the input data source. The example demonstrates that awk considers $1 to be a numeric value and it evaluates to false: {{{ sh echo 00 | awk'{if ($1) {print "true"}else{print "false"}}' false # $1 is the number 0 }}} ==== Taking zero from a variable If a zero value is assigned to a variable, it may be treated as a non empty string and evaluated as true: {{{ $ awk 'BEGIN{var = "0"; if (var) print "True!"}' # This gives the same result with var = "00" True! }}} However, if the variable was assigned in numeric context (without the quotes), it evaluates as false: $ awk 'BEGIN{var = 0; if (var) print "True!"}' # We get no output because evaluation is false === With some awk implementations a zero string can be false in numeric context With some awk implementations a zero string can be false in numeric context: ie with nawk, oawk on solaris and netbsd awk version 20050424 {{{ sh nawk 'BEGIN{var="0"; foo=var+0;if (var){ print "true"}else{print "false"}}' false #same result with var="00" and var=" 00" }}} while with gnu awk, mawk, busybox awk and /usr/xpg4/bin/awk on solaris: {{{ sh gawk 'BEGIN{var="0"; foo=var+0;if (var){ print "true"}else{print "false"}}' true #same result with var="00" and var=" 00" }}} If you want to make sure that your expression is evaluated as a number or as a string you can add 0 or concatenate the null string, respectively: {{{ awk var + 0 # a number it will always be false if var contains 0 or "0" var == 0 # var is evaluated as a number var "" # a string true if non null even if it contains 0 var = "" }}} ==== if you assign 0 to a var Then var is false, no problem === There is no reserved keyword for true or false In awk, there is no reserved keyword for true or false. This is a caveat, because true is a valid variable name that is initialized to 0 or "".
Summary:
This change is a minor edit.
Username: