Cold Block, I mean Code Blocks |
For eight long years, expect-lite was a
simple scripting language. Running scripts from the top to the bottom
of the file. At the request of an expect-lite user, code blocks were
introduced in version 4.2. Code Blocks permit grouping of lines and
add structure to your script.
Code Blocks allow you to
create multi-line conditionals (if statements), while and
foreach loops. Naturally, Code Blocks can be nested. Code blocks
start with a square bracket, [, and end with a closing square
bracket, ]. Indentation within a Code Block is not required, but
makes the script more readable. Let's look at each of these in more
detail.
Multi-line Conditional
It has been a limitation for a long
time, that expect-lite commands had to be on one line. So the
conditional was limited to the following, with the double colon
representing else
?if
$var > $big ? >do something :: >do something else
However with code blocks, it is now
possible to insert multiple lines for the then and else
statement, such as:
?if
$var > $big ? [
;red --- Var:$var is out of bounds
*FAIL
]::[
; === incrementing Var:$var
+$var
]
In the above example, if $var is larger than $big, there is something wrong, tell the user about it using a red coloured comment line, and then mark the script as failed.
The While Loop
The While loop is a simple looping
mechanism which has a test or comparison at the top of the loop, and therefore usually
needs a couple lines of setup before hand.
$i=0
$max=10
[
$i < $max
>echo
$i
+$i
]
In the above example, a loop counter
variable, $i, is set to zero, and a maximum count, $max, is set
before the while loop begins. As mentioned earlier, the code block
begins with the open square bracket, and the while loop test is
defined, $i < $max. The indented lines print out the value of $i
as the while loop progresses, and +$i increments the value of $i.
Lastly, the lone close square bracket on a separate line, indicates
the end of the Code Block, and hence, the while loop.
The Foreach Loop
The foreach loop is another looping mechanism where the items to be iterated over are known beforehand. For example, the script writer may want to iterate over the planet names. In each iteration of the loop, the variable $planet will be assigned a value in the list of planets.
[ $planet=mercury venus earth mars jupiter saturn uranus neptune
>ping6 c1 $planet
]
Of course, until the internet is extended to the interplanetary-internet, using IPv6 naturally, you may not receive an answer to the ping, but you get the idea.
Foreach loops have the limitation in expect-lite, that the items in the list must be space delimited. As you can see in the example above, multiple spaces are allowed. And if your list as something else as a delimiter, such as a comma, there is an expect-lite feature called string math to help.
$planets=mercury,venus,earth,mars,jupiter,saturn,uranus,neptune
; === use string math /search/replace/ to convert commas to spaces
=$planets /,/ /
Please look at the man page, or online documentation for more information on string math.
Keeping it Simple
Code Blocks do add a bit of complexity to the script, but the added structure will bring more power, and clarity to your scripts, all the while keeping it simple.