- •Advanced Bash-Scripting Guide
- •Dedication
- •Table of Contents
- •Part 1. Introduction
- •Advanced Bash-Scripting Guide
- •Chapter 2. Starting Off With a Sha-Bang
- •2.1. Invoking the script
- •2.2. Preliminary Exercises
- •Part 2. Basics
- •Chapter 3. Exit and Exit Status
- •Chapter 4. Special Characters
- •Chapter 5. Introduction to Variables and Parameters
- •5.1. Variable Substitution
- •5.2. Variable Assignment
- •5.3. Bash Variables Are Untyped
- •5.4. Special Variable Types
- •Chapter 6. Quoting
- •Chapter 7. Tests
- •7.1. Test Constructs
- •7.2. File test operators
- •7.3. Comparison operators (binary)
- •7.4. Nested if/then Condition Tests
- •7.5. Testing Your Knowledge of Tests
- •8.1. Operators
- •8.2. Numerical Constants
- •Part 3. Beyond the Basics
- •Chapter 9. Variables Revisited
- •9.1. Internal Variables
- •9.2. Manipulating Strings
- •9.3. Parameter Substitution
- •9.4. Typing variables: declare or typeset
- •9.5. Indirect References to Variables
- •9.6. $RANDOM: generate random integer
- •9.7. The Double Parentheses Construct
- •Chapter 10. Loops and Branches
- •10.1. Loops
- •10.2. Nested Loops
- •10.3. Loop Control
- •10.4. Testing and Branching
- •Chapter 11. Internal Commands and Builtins
- •12.1. Basic Commands
- •12.2. Complex Commands
- •12.3. Time / Date Commands
- •12.4. Text Processing Commands
- •12.5. File and Archiving Commands
- •12.6. Communications Commands
- •12.7. Terminal Control Commands
- •12.8. Math Commands
- •12.9. Miscellaneous Commands
- •Chapter 13. System and Administrative Commands
- •Chapter 14. Command Substitution
- •Chapter 15. Arithmetic Expansion
- •Chapter 16. I/O Redirection
- •16.1. Using exec
- •16.2. Redirecting Code Blocks
- •16.3. Applications
- •Chapter 17. Here Documents
- •Chapter 18. Recess Time
- •Part 4. Advanced Topics
- •Chapter 19. Regular Expressions
- •19.1. A Brief Introduction to Regular Expressions
- •19.2. Globbing
- •Chapter 20. Subshells
- •Chapter 21. Restricted Shells
- •Chapter 22. Process Substitution
- •Chapter 23. Functions
- •23.1. Complex Functions and Function Complexities
- •23.2. Local Variables
- •Chapter 24. Aliases
- •Chapter 25. List Constructs
- •Chapter 26. Arrays
- •Chapter 27. Files
- •Chapter 28. /dev and /proc
- •28.2. /proc
- •Chapter 29. Of Zeros and Nulls
- •Chapter 30. Debugging
- •Chapter 31. Options
- •Chapter 32. Gotchas
- •Chapter 33. Scripting With Style
- •Chapter 34. Miscellany
- •34.2. Shell Wrappers
- •34.3. Tests and Comparisons: Alternatives
- •34.4. Optimizations
- •34.5. Assorted Tips
- •34.6. Oddities
- •34.7. Security Issues
- •34.8. Portability Issues
- •34.9. Shell Scripting Under Windows
- •Chapter 35. Bash, version 2
- •36. Endnotes
- •36.1. Author's Note
- •36.2. About the Author
- •36.3. Tools Used to Produce This Book
- •36.4. Credits
- •List of Tables
- •List of Examples
- •Bibliography
Testing Your Knowledge of Tests
|
Advanced Bash-Scripting Guide: |
|
Prev |
Chapter 7. Tests |
Next |
7.5. Testing Your Knowledge of Tests
The systemwide xinitrc file can be used to launch the X server. This file contains quite a number of if/then tests, as the following excerpt shows.
if [ -f $HOME/.Xclients ]; then exec $HOME/.Xclients
elif [ -f /etc/X11/xinit/Xclients ]; then exec /etc/X11/xinit/Xclients
else
#failsafe settings. Although we should never get here
#(we provide fallbacks in Xclients as well) it can't hurt. xclock -geometry 100x100-5+5 &
xterm -geometry 80x50-50+150 &
if [ -f /usr/bin/netscape -a -f /usr/share/doc/HTML/index.html ]; then netscape /usr/share/doc/HTML/index.html &
fi
fi
Explain the "test" constructs in the above excerpt, then examine the entire file, /etc/X11/xinit/xinitrc, and analyze the if/then test constructs there. You may need to refer ahead to the discussions of grep, sed, and regular expressions.
Prev |
Home |
Next |
Nested if/then Condition Tests |
Up |
Operations and Related Topics |
http://tldp.org/LDP/abs/html/testtest.html [7/15/2002 6:35:28 PM]
Preliminary Exercises
|
Advanced Bash-Scripting Guide: |
|
Prev |
Chapter 2. Starting Off With a Sha-Bang |
Next |
2.2. Preliminary Exercises
1.System administrators often write scripts to automate common tasks. Give several instances where such scripts would be useful.
2.Write a script that upon invocation shows the time and date, lists all logged-in users, and gives the system uptime. The script then saves this information to a logfile.
Prev |
Home |
Next |
Invoking the script |
Up |
Basics |
http://tldp.org/LDP/abs/html/prelimexer.html [7/15/2002 6:35:28 PM]
Tests and Comparisons: Alternatives
|
Advanced Bash-Scripting Guide: |
|
Prev |
Chapter 34. Miscellany |
Next |
34.3. Tests and Comparisons: Alternatives
For tests, the [[ ]] construct may be more appropriate than [ ]. Likewise, arithmetic comparisons might benefit from the (( )) construct.
a=8 |
|
|
|
|
# All of the |
comparisons below are equivalent. |
|
|
|
test "$a" |
-lt 16 && echo "yes, $a < 16" |
# "and list" |
|
|
/bin/test |
"$a" -lt 16 && echo "yes, $a < 16" |
|
|
|
[ "$a" -lt 16 ] && echo "yes, $a < 16" |
|
|
||
[[ $a -lt |
16 |
]] && echo "yes, $a < 16" |
# Quoting variables within |
|
(( a < 16 |
)) |
&& echo "yes, $a < 16" |
# [[ ]] and (( )) not necessary. |
|
city="New |
York" |
|
|
|
# Again, all |
of the comparisons below are equivalent. |
|
||
test "$city" |
\< Paris && echo "Yes, Paris is greater than $city" |
# Greater ASCII |
||
order. |
|
|
|
|
/bin/test |
"$city" \< Paris && echo "Yes, Paris is greater than $city" |
|||
[ "$city" |
\< |
Paris ] && echo "Yes, Paris is greater than $city" |
|
|
[[ $city < Paris ]] && echo "Yes, Paris is greater than $city" |
# Need not quote |
|||
$city. |
|
|
|
|
# Thank you, |
S.C. |
|
|
|
|
|
|
|
|
Prev |
Home |
Next |
Shell Wrappers |
Up |
Optimizations |
http://tldp.org/LDP/abs/html/testsandcomparisons.html [7/15/2002 6:35:29 PM]