===== CS 279 - Week 4 Lecture 1 - 2022-09-12 ===== ===== TODAY WE WILL ===== * a few announcements/reminders * interactive input * command-line variables * *maybe* start some bash control structures * prep for next class ===== interactive input: read command ===== * one pretty easy way to obtain input form the user while the script is running is by using the read command read desired_variable * it reads everything the user types until a newline/return/enter is typed and stores it into the given variable * in trying out the little script simple-read, it appears that read ignore leading and trailing blanks! ===== command-line arguments ===== * note: bash expects command-line arguments to be separated by blanks (so you can include a blank in a command argument by quoting that argument, or preceding each non-separating blank with a \) cp file1 "file 2" cp file1 'file 2' cp file1 file\ 2 * within a bash shell, $1 will be the first command line argument, $2 will be the second command line argument, ... $0 will be running script's name...! (may be expressed close to how you typed it in the command) * $# will be set to the number of command line arguments * it LOOKS like $* and $@ both contain the whole set of command line arguments [I need to look up IF there is a difference...] * based on the comment in Section 3.2.5 in https://www.gnu.org/software/bash/manual/bash.html $@ is the SAFER choice, and we'll be sticking with that. ===== a few more goodies... ===== * expr command evaluates an expression and sends the result to standard output > expr 3 + 5 8 * basename - grabs the base/basename from a pathname (the "last" part, the loca filename) dirname - grabs everything but the base/basename (the directory of the basename, if you will) ==== ASIDE - exiting a shell script early ==== * you can use the exit command to exit a shell script early ...give it an argument with the return code ...remember that 0 is considered success in bash...! exit 1 ===== STARTING 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 * test commands...? the possibly-list of test commands are executed, if its return status is zero (success) then the if's commands are executed * WE WILL TALK MORE ABOUT THESE, but to get us started: SOME conditionals work inside of [ ], which is considered the same as giving them as arguments to the test command [ ] are considered a command and so need to be surrounded by at least a blank for example: -e <filename> ...will be treated as success/true if <filename> exists. = can be used to compare if two STRINGS have the same contents -eq can be used to compare if two NUMBERS have the same value * ! is prefix not || is Boolean or && is Boolean and * for example (these are demo'd in bash script if-play) if [ $# -eq 0 ] then echo -n "Enter a file name: " read input else input=$1 fi echo "\$input: [$input]" if [ ! -e $input ] then echo "$0: $input does not exist" echo "...exiting" exit 1 fi echo "$input's contents: " ls -l $input