\HAPbookmark{}{section.1}{Intro}{2}{} \HAPbookmark{}{section.1.1}{Aim}{2}{section.1} \HAPbookmark{}{section.1.2}{Why Shell Scripting?}{3}{section.1} \HAPbookmark{}{section.1.3}{Where to get more information}{4}{section.1} \HAPbookmark{}{section.1.4}{The Shell is an Interpreter}{5}{section.1} \HAPbookmark{}{section.1.5}{The Shebang}{6}{section.1} \HAPbookmark{}{section.1.6}{Making the script executable}{7}{section.1} \HAPbookmark{}{section.2}{Quoting and Funny Chars}{8}{} \HAPbookmark{}{section.2.1}{Special Characters}{8}{section.2} \HAPbookmark{}{section.2.2}{Special Characters---continued: 2}{9}{section.2} \HAPbookmark{}{section.2.3}{Special Characters---continued: 3}{10}{section.2} \HAPbookmark{}{section.2.4}{Quoting}{11}{section.2} \HAPbookmark{}{section.2.5}{Quoting---2}{12}{section.2} \HAPbookmark{}{section.2.6}{Quoting---When to use it?}{13}{section.2} \HAPbookmark{}{section.3}{Variables}{14}{} \HAPbookmark{}{section.3.1}{True and False}{14}{section.3} \HAPbookmark{}{section.3.2}{Variables---1}{15}{section.3} \HAPbookmark{}{section.3.3}{Variables---Assignments}{16}{section.3} \HAPbookmark{}{section.3.4}{Variables---Local to Script}{17}{section.3} \HAPbookmark{}{section.3.5}{Variables---Unsetting Them}{18}{section.3} \HAPbookmark{}{section.3.6}{Command-line Parameters}{19}{section.3} \HAPbookmark{}{section.3.7}{Special Built-in Variables}{20}{section.3} \HAPbookmark{}{section.3.8}{Variables: use Braces \texttt {\$\{\dots \}}}{21}{section.3} \HAPbookmark{}{section.3.9}{Braces and Parameters after \textbf {\$9}}{22}{section.3} \HAPbookmark{}{section.3.10}{More about Quoting}{23}{section.3} \HAPbookmark{}{section.4}{Command Substitution}{24}{} \HAPbookmark{}{section.4.1}{Command Substitution}{24}{section.4} \HAPbookmark{}{section.4.2}{Command Substitution---Example}{25}{section.4} \HAPbookmark{}{section.5}{Conditions}{26}{} \HAPbookmark{}{section.5.1}{Conditions---String Comparisons}{26}{section.5} \HAPbookmark{}{section.5.2}{Conditions---Integer Comparisons}{27}{section.5} \HAPbookmark{}{section.5.3}{Conditions---File Tests, NOT Operator}{28}{section.5} \HAPbookmark{}{section.5.4}{Conditions---Combining Comparisons}{29}{section.5} \HAPbookmark{}{section.6}{Arithmetic}{30}{} \HAPbookmark{}{section.6.1}{Arithmetic Assignments}{30}{section.6} \HAPbookmark{}{section.6.2}{\texttt {\$((\dots ))}}{31}{section.6} \HAPbookmark{}{section.6.3}{\texttt {((\dots ))}}{32}{section.6} \HAPbookmark{}{section.7}{Statements}{33}{} \HAPbookmark{}{section.7.1}{\texttt {if} Statement}{33}{section.7} \HAPbookmark{}{section.7.2}{\texttt {while} Statement}{34}{section.7} \HAPbookmark{}{section.7.3}{\texttt {for} Statement}{35}{section.7} \HAPbookmark{}{section.7.4}{\texttt {for} Loops: Another Example}{36}{section.7} \HAPbookmark{}{section.7.5}{\texttt {for (( ; ; ))}}{37}{section.7} \HAPbookmark{}{section.7.6}{Blocks: \texttt {\{\dots \}}}{39}{section.7} \HAPbookmark{}{section.7.7}{Flow Control: \texttt {\textbar \textbar } \texttt {\&\&}}{40}{section.7} \HAPbookmark{}{section.8}{Input \& Output}{41}{} \HAPbookmark{}{section.8.1}{Output: \texttt {echo} and \texttt {printf}}{41}{section.8} \HAPbookmark{}{section.8.2}{Input: the \texttt {read} Command}{42}{section.8} \HAPbookmark{}{section.8.3}{Split with \texttt {set}}{43}{section.8} \HAPbookmark{}{section.8.4}{More about \texttt {set}, and \texttt {IFS}}{44}{section.8} \HAPbookmark{}{section.8.5}{Example: Changing \texttt {IFS}}{45}{section.8} \HAPbookmark{}{section.9}{Command-line Parameters}{46}{} \HAPbookmark{}{section.9.1}{\texttt {case} Statement}{46}{section.9} \HAPbookmark{}{section.9.2}{\texttt {case} Statement: Example}{47}{section.9} \HAPbookmark{}{section.9.3}{\texttt {shift} Up}{48}{section.9} \HAPbookmark{}{section.9.4}{\texttt {shift}: Many Places}{49}{section.9} \HAPbookmark{}{section.9.5}{Command-Line Options---1}{50}{section.9} \HAPbookmark{}{section.9.6}{Command-Line Options---2}{51}{section.9} \HAPbookmark{}{section.9.7}{Command-Line Options---3}{52}{section.9} \HAPbookmark{}{section.9.8}{\texttt {getopts}---4}{53}{section.9} \HAPbookmark{}{section.9.9}{\texttt {getopts}: Command-Line Options---5}{54}{section.9} \HAPbookmark{}{section.10}{Temporary Files, Signals}{55}{} \HAPbookmark{}{section.10.1}{Temporary Files: \texttt {mktemp}}{55}{section.10} \HAPbookmark{}{section.10.2}{Signals that may Terminate your Script}{56}{section.10} \HAPbookmark{}{section.10.3}{Signals: \texttt {trap}}{57}{section.10} \HAPbookmark{}{section.10.4}{Signals: \texttt {trap} Example}{58}{section.10} \HAPbookmark{}{section.11}{Functions}{59}{} \HAPbookmark{}{section.11.1}{Functions}{59}{section.11} \HAPbookmark{}{section.11.2}{Parameters in Functions}{60}{section.11} \HAPbookmark{}{section.11.3}{Example, Calling a Function}{61}{section.11} \HAPbookmark{}{section.12}{Debugging}{62}{} \HAPbookmark{}{section.12.1}{Debugging Shell Scripts---1}{62}{section.12} \HAPbookmark{}{section.12.2}{Debugging Shell Scripts---2}{63}{section.12} \HAPbookmark{}{section.12.3}{Writing Shell Scripts}{64}{section.12} \HAPbookmark{}{section.12.4}{Useful External Programs---1}{65}{section.12} \HAPbookmark{}{section.12.5}{Useful External Programs---2}{66}{section.12} \HAPbookmark{}{section.13}{Regular Expressions}{67}{} \HAPbookmark{}{section.13.1}{Regular Expressions}{67}{section.13} \HAPbookmark{}{section.13.2}{What is In a Regular Expression?}{68}{section.13} \HAPbookmark{}{section.13.3}{Literal characters}{69}{section.13} \HAPbookmark{}{section.13.4}{Character Classes: \texttt {[\dots ]}}{70}{section.13} \HAPbookmark{}{section.13.5}{Negated Character Classes: \texttt {[\textasciicircum \dots ]}}{71}{section.13} \HAPbookmark{}{section.13.6}{Match Any Character}{72}{section.13} \HAPbookmark{}{section.13.7}{Matching the Beginning or End of Line}{73}{section.13} \HAPbookmark{}{section.13.8}{Match Repetitions: \texttt {*}, \texttt {?}, \texttt {+}, \texttt {\{n\}}, \texttt {\{n,m\}}}{74}{section.13} \HAPbookmark{}{section.13.9}{Matching Alternatives: ``\texttt {\textbar }''}{75}{section.13} \HAPbookmark{}{section.13.10}{Putting it All Together: Examples}{76}{section.13} \HAPbookmark{}{section.14}{\texttt {awk} and \texttt {sed}}{77}{} \HAPbookmark{}{section.14.1}{Basic \texttt {awk}}{77}{section.14} \HAPbookmark{}{section.14.2}{What Does \texttt {awk} Do?}{78}{section.14} \HAPbookmark{}{section.14.3}{\texttt {awk} Examples}{79}{section.14} \HAPbookmark{}{section.14.4}{\texttt {sed}---the Stream Editor}{80}{section.14} \HAPbookmark{}{section.14.5}{\texttt {sed}---Backreferencees}{81}{section.14} \HAPbookmark{}{section.14.6}{\texttt {sed}---Backreferencees: Example}{82}{section.14} \HAPbookmark{}{section.15}{\texttt {find}}{83}{} \HAPbookmark{}{section.15.1}{\texttt {find} Examples}{83}{section.15} \HAPbookmark{}{section.15.2}{Finding SUID Programs}{84}{section.15} \HAPbookmark{}{section.15.3}{A \texttt {find} Example with Many Options}{85}{section.15} \HAPbookmark{}{section.15.4}{\texttt {rpm} Database Query Commands}{86}{section.15}