Loops That Test Exit Status (Unix Power Tools, 3rd Edition)
35.15. Loops That Test Exit Status
The Bourne
shell has two kinds of loops that run a command and test its exit
status. An until loop will continue until the
command returns a zero status. A while loop will
continue while the command returns a zero status.
35.15.1. Looping Until a Command Succeeds
The
until loop runs a command repeatedly until it
succeeds. That is, if the command returns a nonzero status, the shell
executes the body of the loop and then runs the loop control command
again. The shell keeps running the command until it returns a zero
status, as shown in the following example:
% cat sysmgr
#!/bin/sh
until who | grep "^barb "
do sleep 60
done
echo The system manager just logged on.
% sysmgr &
[1] 2345
...time passes...
barb ttyp7 Jul 15 09:30
The system manager just logged on.
The loop runs who (Section 2.8) and pipes that output to grep (Section 13.1), which
searches for any line starting with barb and a
space. (The space makes sure that usernames like
barbara don't match.) If
grep returns a nonzero status (no lines matched),
the shell waits 60 seconds. Then the loop repeats, and the script
tries the who |
grep command again. It keeps doing this until
grep returns a zero status -- then the loop is
broken and control goes past the done line. The
echo command prints a message and the script
quits. (I ran this script in the background so I could do something
else while I waited for Barb.)
This is also a useful way to get someone with whom you share a
machine to turn on their cell phone: just set a loop to wait until
they login and then send them a write message (in
case they don't always check their email, like a few
nocturnal system administrators I know).
[A Bourne shell until loop is
not identical to the until
construction in most programming languages, because the condition is
evaluated at the top of the loop. Virtually all languages with an
until loop evaluate the condition at the bottom.
-- ML]
35.15.2. Looping Until a Command Fails
Go to http://examples.oreilly.com/upt3 for more information on: catsaway
The while loop is
the opposite of the until loop. A
while loop runs a command and loops until the
command fails (returns a nonzero status). The
catsaway program below uses a
while loop to watch the who
output for the system manager to log off. It's the
opposite of the sysmgr script.
/dev/null Section 43.12
% cat catsaway
#!/bin/sh
while who | grep "^barb " > /dev/null
do sleep 60
done
echo "The cat's away..."
% catsaway &
[1] 4567
...time passes...
The cat's away...
-- JP
35.14. Testing Your Success35.16. Set Exit Status of a Shell
Copyright © 2003 O'Reilly & Associates. All rights reserved.
Wyszukiwarka