CS 279 - Week 4 Lecture 2 - 2022-09-14

TODAY WE WILL
*   announcements
*   a few odds-and-ends
*   intro to bash's two kinds of for loops
*   more on the bash if statement
    (really, some more of its possible conditions!)
*   prep for next class

Next Reading
*   Section III, Chapter 24 - has good info on bash
    control structures

====
*   Course text, Section 12.1 - white space removal

    *   in handling/interpreting/parsing commands,
        the bash shell uses blanks/tabs to separate
	arguments

    *   ...it happily ignores/throws out any excess
        blanks or tabls
====
*   NOTE:

    you CAN execute a shell without making it executable
    if you use the sh command:

    > sh my-script-name

====
difference between $@ and $*?
====
*   both do give a way to grab all the command line
    arguments from a call --

    they are subtly different,
    but The Linux Document Project's "Bash Guide for Beginners"
    Section 3.2.5, notes $* can have security issues,
    so we'll stick with $@

====
bash's for loops
====
*   one iterates over a list -- let's call that
    a "list-style" for loop

*   one is closer to the "classic" C/C++ for loop --
    let's call that a "classic" for loop

*   "list-style" for is discussed in course text Section 24.4:

    for desired_var_name in list_expr
    do
        command1
	command2
	...
    done

    *   YES, it turns out the do MUST be on a separate
        line than the for part!

    *   loop iterates for each value in list_expr,
        setting desired_var_name to each list value
	in turn

*   "classic" style - not in course text, but:

    for ((init_part; bool_part; update_part))
    do
        command1
	command2
	...
    done

    *   YES, it turns out the do MUST be on a separate
        line than the for part!

    *   semantics are probably what you think --
        do update_part when you first reach the loop,
	
	if bool_part evaluates to a truthlike value,
	enter the loop;

        at the end of the loop, do the update part,
	and if bool_part evaluates to a truthlike value,
	enter the loop again

	...

=====
demoing some list-style for loops
=====
*   how can I get a list for this for loop?

    *   the output of a command written in backquotes
    *   $@, containing the command-line arguments,
        is considered a list
    *   I'm pretty sure there are more...
    
=====
continuing our intro to if
=====
*   basic syntax: is NOT that from the C/C++/Java/C#/JavaScript
    family!!!

    if <test-commands>
    then
        commands-if-test-command-true
    fi

    if <test-commands>
    then
        commands-if-test-command-true
    else
        commands-if-test-command-false
    fi

    if <test-commands1>
    then
        commands-if-test-commands1-true
    elif <test-commands2>
        commands-if-test-commands1-false-and-test-commands2-true
    elif <test-cmds3>
        commands-for-reach-here-and-test-cmd3-true
    ...
    else # this is still optional
        commands-if-all-the-prev-test-cmds-were-false
    fi