0% found this document useful (0 votes)
13 views

Bash Scripting Continued

The document discusses Linux exit statuses and how to check them in Bash scripts. Some key points: - Every Linux command returns an exit status (integer from 0-255) upon completion, with 0 usually denoting success and non-zero usually denoting error. - The $? variable holds the exit status of the last command. For example, cat on a missing file returns 1 (failure) while ls returns 0 (success). - The test command and [ ] syntax can check conditions and return 0 (true) or 1 (false). Operators like -lt, -gt compare values. - If/else and compound conditionals like && and || allow conditional logic. Spaces around [ ]

Uploaded by

Hưng Minh Phan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views

Bash Scripting Continued

The document discusses Linux exit statuses and how to check them in Bash scripts. Some key points: - Every Linux command returns an exit status (integer from 0-255) upon completion, with 0 usually denoting success and non-zero usually denoting error. - The $? variable holds the exit status of the last command. For example, cat on a missing file returns 1 (failure) while ls returns 0 (success). - The test command and [ ] syntax can check conditions and return 0 (true) or 1 (false). Operators like -lt, -gt compare values. - If/else and compound conditionals like && and || allow conditional logic. Spaces around [ ]

Uploaded by

Hưng Minh Phan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

Exit Status

• Every Linux command returns an integer code when it finishes,


called its “exit status”
 0 usually* denotes success, or an OK exit status
 Anything other than 0 (1 to 255) usually denotes an error
Lecture 6 • You can return an exit status explicitly using the exit statement
• You can check the status of the last command executed in the
variable $?
Bash scripting continued $
$
cat someFileThatDoesNotExist.txt
echo $?
1 # “Failure”
$ ls
$ echo $?
0 # “Success”
* One example exception: diff returns “0” for no differences,
“1” if differences found, “2” for an error such as invalid filename argument
1 2

1 2

if/else The test command


if [ condition ]; then # basic if
$ test 10 –lt 5
commands
$ echo $?
fi
1 # “False”, “Failure”
$ test 10 –gt 5
if [ condition ]; then # if / else if / else $ echo $?
commands1 0 # “True”, “Success”
elif [ condition ]; then
commands2
else
• Another syntax for the test command:
commands3
Don’t forget the space after [ and before ]
fi $ [ 10 –lt 5 ]
$ echo $?
• The [ ] syntax is actually shorthand for a shell command called “test” 1 # “False”, “Failure”
(Try: “man test”) $ [ 10 –gt 5 ]
• there MUST be spaces as shown: $ echo $?
if space [ space condition space ] 0 # “True”, “Success”
• include the semi-colon after ] (or put “then” on the next line)
3 4

3 4

1
test operators More if testing
comparison operator description
compound comparison operators description
=, !=, \<, \> compares two string variables
if [ expr1 -a expr2 ]; then ... and
-z, -n tests if a string is empty (zero-length) or not empty
(nonzero-length) if [ expr1 ] && [ expr2 ]; then ...
-lt, -le, -eq, compares numbers; equivalent to Java's if [ expr1 -o expr2 ]; then ... or
-gt, -ge, -ne <, <=, ==, >, >=, != if [ expr1 ] || [ expr2 ]; then ...
-e, -f, -d tests whether a given file or directory exists if [ ! expr ]; then ... not
-r, -w, -x tests whether a file exists and is readable/writable/executable
# alert user if running >= 10 processes when
if [ $USER = “husky14" ]; then # attu is busy (>= 5 users logged in)
echo ‘Woof! Go Huskies!’ LOGINS=$(w -h | wc -l)
fi
PROCESSES=$(ps -u $USER | wc -l)
LOGINS=$(w -h | wc -l) if [ $LOGINS -ge 5 -a $PROCESSES -gt 10 ]; then
if [ $LOGINS -gt 10 ]; then echo "Quit hogging the server!"
echo ‘attu is very busy right now!’ fi
fi
*Note: man test will show other operators.
5 6

5 6

safecopy Exercise safecopy Exercise Solution


• Write a script called safecopy that will mimic the behavior of cp –i #!/bin/bash
where from is a filename and to is a filename:
FROM=$1
TO=$2
$ cp –i from.txt to.txt
Do you want to overwrite to.txt? (yes/no)
if [ -e $TO ]; then
read -p "Do you want to overwrite $TO?" ANSWER
if [ $ANSWER = "yes" ]; then
$ ./safecopy.sh from.txt to.txt cp $FROM $TO
Do you want to overwrite to.txt? (yes/no) fi
else
cp $FROM $TO
fi

7 8

7 8

2
BMI Exercise BMI Exercise solution
#!/bin/bash
• Write a program that computes the user's body mass index (BMI) to # Body Mass Index (BMI) calculator
the nearest integer, as well as the user's weight class: if [ $# -lt 2 ]; then
echo "Usage: $0 weight height"
BMI Weight class exit 1 # 1 indicates failure, 0 for success
 18 underweight fi
18 - 24 normal
let H2=“$2 * $2”
25 - 29 overweight let BMI="703 * $1 / $H2"
$ ./bmi.sh
Usage: ./bmi.sh weight height  30 obese echo "Your Body Mass Index (BMI) is $BMI"
if [ $BMI -le 18 ]; then
echo "Here is a sandwich; please eat."
$ ./bmi.sh 112 72
elif [ $BMI -le 24 ]; then
Your Body Mass Index (BMI) is 15
echo "You're in normal weight range."
Here is a sandwich; please eat. elif [ $BMI -le 29 ]; then
echo "You could stand to lose a few."
$ ./bmi.sh 208 67 else
Your Body Mass Index (BMI) is 32 echo "There is more of you to love."
There is more of you to love. fi
9 10

9 10

Common errors while and until loops


• [: -eq: unary operator expected
 you used an undefined variable in an if test while [ condition ]; do # go while condition is true
commands
done
• [: too many arguments
 you tried to use a variable with a large, complex value (such as multi-
line output from a program) as though it were a simple int or string
until [ condition ]; do # go while condition is false
commands
• let: syntax error: operand expected (error token is " ") done
 you used an undefined variable in a let mathematical expression

11 12

11 12

3
While exercise While Exercise solution
#!/bin/bash
• Prompt the user for what they would like to do. While their answer # What would you like to do?
is “open the pod bay doors” tell them that you cannot do read -p "What would you like me to do? " ACTION
that and prompt for another action. echo "You said: $ACTION"
while [ "$ACTION" = "open the pod bay doors" ]; do
echo "I'm sorry Dave, I'm afraid I can't do that."
read -p "What would you like me to do? " ACTION
echo "You said: $ACTION"
done
echo "Bye"

The quotes around “$ACTION” are important here,


try removing them and see what happens.

13 14

13 14

select and case Select Example


• Bash Select statement: PS3="What is your favorite food? " # Goes with the select stmt
PS3=prompt # Special variable* for the select prompt
select choice in choices; do echo "Welcome to the select example!"
echo "It prints out a list of choices"
commands
echo "but does nothing interesting with the answer."
break # Break, otherwise endless loop
done select CHOICE in "pizza" "sushi" "oatmeal" "broccoli"; do
echo "You picked $CHOICE"
• Bash Case statement: break
case EXPRESSION in done
CASE1) COMMAND-LIST;;
CASE2) COMMAND-LIST;; echo “For the select statement, you pick a number as your choice."
...
CASEN) COMMAND-LIST;;
esac
*see lecture 5
15 16

15 16

4
Case Example select/case Exercise
echo "Welcome to the case example!" • Have the user select their favorite kind of music, and output a
echo "Without a select statement, you must get the spelling/case exact." message based on their choice
read -p "What format do you prefer? (tape/cd/mp3/lp) " FORMAT
echo "You said $FORMAT"

case "$FORMAT" in
"tape") echo "no random access!";;
"cd") echo "old school";;
"mp3") echo "how modern";;
"lp") echo "total retro";;
esac

17 18

17 18

select/case Exercise Solution Arrays


PS3="What is your favorite kind of music? " name=(element1 element2 ... elementN)
select CHOICE in "rock" "pop" "dance" "reggae"; do
case "$CHOICE" in name[index]=value # set an element
"rock") echo "Rock on, dude.";;
"pop") echo "Top 100 is called that for a reason.";; $name # get first element
"dance") echo "Let's lay down the Persian!";; ${name[index]} # get an element
"reggae") echo "Takin' it easy...";;
* ) echo "come on...you gotta like something!";; ${name[*]} # elements sep.by spaces
esac
${#name[*]} # array's length
break
done
 arrays don't have a fixed length; they can grow as necessary
 if you go out of bounds, shell will silently give you an empty string
• you don't need to use arrays in assignments in this course

19 20

19 20

5
Functions
function name() { # declaration
commands # ()’s are optional
}

name # call

 functions are called simply by writing their name (no parens)


 parameters can be passed and accessed as $1, $2, etc. (icky)
• you don't need to use functions in assignments in this course

21

21

You might also like