Pro
Chris F.A. Johnson
Contents | |
|---|---|
| About the Author | xvii |
| About the Technical Reviewer | xviii |
| Introduction | xix |
| Chapter 1: Hello, World! Your First Shell Program | 1 |
| The Code | 1 |
| The File | 2 |
| The Naming of Scripts | 2 |
| Selecting a Directory for the Script | 2 |
| Creating the File and Running the Script | 3 |
| Choosing and Using a Text Editor | 3 |
| Building a Better "Hello, World!" | 5 |
| Summary | 5 |
| Commands | 5 |
| Concepts | 6 |
| Variables | 6 |
| Exercises | 6 |
| Chapter 2: Input, Output, and Throughput | 7 |
| Parameter and Variables | 7 |
| Positional Parameters | 7 |
| Special *@#0$?_!- Parameters | 8 |
| Variables | 8 |
| Arguments and Options | 8 |
| echo, and Why You Should Avoid It | 9 |
| printf: Formatting and Printing Data | 9 |
| Escape Sequences | 10 |
| Format Specifiers | 10 |
| Width Specification | 11 |
| Printing to a Variable | 13 |
| Line Continuation | 13 |
| Standard Input/Output Streams and Redirection | 13 |
| Redirection: >, >>, and < | 13 |
| Reading Input | 15 |
| Pipelines | 15 |
| Command Substitution | 16 |
| Summary | 16 |
| Commands | 16 |
| Concepts | 16 |
| Exercises | 17 |
| Chapter 3: Looping and Branching | 19 |
| Exit Status | 19 |
| Testing an Expression | 19 |
| test, aka [ ... ] | 20 |
| [[ ... ]]: Evaluate an Expression | 21 |
| (( ... )): Evaluate an Arithmetic Expression | 22 |
| Lists | 22 |
| Conditional execution | 22 |
| if | 22 |
| Conditional Operators, && and || | 23 |
| case | 24 |
| Looping | 25 |
| while | 25 |
| until | 26 |
| for | 26 |
| break | 26 |
| continue | 27 |
| Summary | 27 |
| Commands | 27 |
| Concepts | 28 |
| Exercises | 28 |
| Chapter 4: Command-Line Parsing and Expansion | 29 |
| Quoting | 30 |
| Brace Expansion | 31 |
| Tilde Expansion | 32 |
| Parameter and Variable Expansion | 33 |
| Arithmetic Expansion | 33 |
| Command Substitution | 35 |
| Word Splitting | 36 |
| Pathname Expansion | 37 |
| Process Substitution | 37 |
| Parsing Options | 38 |
| Summary | 41 |
| Commands | 41 |
| Exercises | 41 |
| Chapter 5: Parameters and Variables | 43 |
| The Scope of a Variable: Can You See It from Here? | 43 |
| Shell Variables | 44 |
| The Naming of Variables | 46 |
| Parameter Expansion | 46 |
| Bourne Shell | 46 |
| POSIX Shell | 49 |
| Bash | 51 |
| Bash-4.0 | 52 |
| Positional Parameters | 53 |
| Arrays | 54 |
| Integer-Indexed Arrays | 54 |
| Associative Arrays | 56 |
| Summary | 56 |
| Commands | 56 |
| Concepts | 57 |
| Exercises | 57 |
| Chapter 6: Shell Functions | 59 |
| Definition Syntax | 59 |
| Compound Commands | 61 |
| Getting Results | 62 |
| Set Different Exit Codes | 62 |
| Print the Result | 63 |
| Place Results in One or More Variables | 63 |
| Function Libraries | 64 |
| Using Functions from Libraries | 64 |
| Sample Script | 64 |
| Summary | 66 |
| Commands | 66 |
| Exercises | 66 |
| Chapter 7: String Manipulation | 67 |
| Concatenation | 67 |
| Repeat Character to a Given Length | 68 |
| Processing Character by Character | 69 |
| Reversal | 70 |
| Case Conversion | 70 |
| Comparing Contents Without Regard to Case | 72 |
| Check for Valid Variable Name | 73 |
| Insert One String into Another | 74 |
| Examples | 74 |
| Overlay | 74 |
| Examples | 75 |
| Trim Unwanted Characters | 75 |
| Examples | 76 |
| Index | 77 |
| Summary | 78 |
| Commands | 78 |
| Functions | 78 |
| Exercises | 78 |
| Chapter 8: File Operations and Commands | 79 |
| Reading a File | 79 |
| External Commands | 81 |
| cat | 81 |
| head | 82 |
| touch | 83 |
| ls | 83 |
| cut | 84 |
| wc | 85 |
| Regular Expressions | 85 |
| grep | 86 |
| sed | 87 |
| awk | 88 |
| File Name Expansion Options | 89 |
| nullglob | 90 |
| failglob | 91 |
| dotglob | 91 |
| extglob | 91 |
| nocaseglob | 93 |
| globstar | 93 |
| Summary | 94 |
| Shell Options | 94 |
| External Commands | 94 |
| Exercises | 95 |
| Chapter 9: Reserved Words and Builtin Commands | 97 |
| help, Display Information About Builtin Commands | 97 |
| time, Print Time Taken for Execution of a Command | 98 |
| read, Read a Line from an Input Stream | 99 |
| -r, Read Backslashes Literally | 99 |
| -e, Get Input with the readline Library | 100 |
| -a, Read Words into an Array | 100 |
| -d DELIM, Read Until DELIM Instead of a Newline | 101 |
| -n NUM, Read a Maximum of NUM Characters | 101 |
| -s, Do Not Echo Input Coming from a Terminal | 101 |
| -p PROMPT:, Output PROMPT Without a Trailing Newline | 101 |
| -t TIMEOUT, Only Wait TIMEOUT Seconds for Complete Input | 102 |
| -u FD: Read from File Descriptor FD Instead of the Standard Input | 102 |
| -i TEXT, Use TEXT as the Initial Text for readline | 103 |
| eval, Expand Arguments and Execute Resulting Command | 103 |
| Poor Man's Arrays | 104 |
| Setting Multiple Variables from One Command | 106 |
| type, Display Information About Commands | 106 |
| builtin, Execute a Builtin Command | 108 |
| command, Execute a Command or Display Information About Commands | 108 |
| pwd, Print the Current Working Directory | 108 |
| unalias, Remove One or More Aliases | 109 |
| Deprecated Builtins | 109 |
| Dynamically Loadable Builtins | 109 |
| Summary | 110 |
| Commands and Reserved Words | 110 |
| Deprecated Commands | 111 |
| Exercises | 111 |
| Chapter 10: Writing Bug-Free Scripts and Debugging the Rest | 113 |
| Prevention Is Better Than Cure | 113 |
| Structure Your Programs | 113 |
| Document Your Code | 116 |
| Format Your Code Consistently | 117 |
| The K.I.S.S. Principle | 117 |
| Test As You Go | 118 |
| Debugging a Script | 120 |
| Summary | 123 |
| Exercises | 123 |
| Chapter 11: Programming for the Command Line | 125 |
| Manipulating the Directory Stack | 125 |
| cd | 125 |
| pd | 126 |
| cdm | 127 |
| menu | 128 |
| Filesystem Functions | 129 |
| l | 129 |
| lsr | 130 |
| cp, mv | 131 |
| md | 131 |
| Miscellaneous Functions | 132 |
| pr1 | 132 |
| calc | 133 |
| Managing Man Pages | 133 |
| sman | 133 |
| sus | 134 |
| k | 134 |
| Games | 134 |
| The Fifteen Puzzle | 136 |
| Summary | 140 |
| Exercises | 140 |
| Chapter 12: Runtime Configuration | 141 |
| Defining Variables | 141 |
| Command-Line Options and Arguments | 141 |
| Menus | 142 |
| Q&A Dialogue | 143 |
| Configuration Files | 143 |
| Scripts with Several Names | 144 |
| Environment Variables | 146 |
| All Together Now | 146 |
| ## Script Information | 147 |
| ## Default Configuration | 147 |
| ## Screen Variables | 148 |
| ## Function Definitions | 148 |
| ## Parse Command-Line Options | 154 |
| ## Bits and Pieces | 155 |
| Summary | 156 |
| Exercises | 156 |
| Chapter 13: Data Processing | 157 |
| Arrays | 157 |
| Holes in an Indexed Array | 157 |
| Using an Array for Sorting | 158 |
| Two-Dimensional Grids | 163 |
| Data File Formats | 171 |
| Line-Based Records | 172 |
| Block File Formats | 175 |
| Summary | 176 |
| Exercises | 177 |
| Chapter 14: Scripting the Screen | 179 |
| Teletypewriter vs. Canvas | 179 |
| Stretching the Canvas | 180 |
| CSI: Command Sequence Introducer | 180 |
| Priming the Canvas | 181 |
| Moving the Cursor | 181 |
| Changing Rendition Modes and Colors | 182 |
| Placing a Block of Text on the Screen | 183 |
| Scrolling Text | 186 |
| Rolling Dice | 187 |
| Summary | 189 |
| Exercises | 189 |
| Chapter 15: Entry-Level Programming | 191 |
| Single-Key Entry | 191 |
| Function Library, key-funcs | 191 |
| History in Scripts | 197 |
| Sanity Checking | 198 |
| Form Entry | 199 |
| Reading the Mouse | 200 |
| Summary | 204 |
| Exercises | 204 |
| Appendix: Shell Variables | 205 |
| Index | 219
|