The shell has a full featured if very weird programing language. It has variables, control structures, and input-output methods.
Why: People use bash not because it is the best programing language around (it's not) but because it is something of a standard. All UNIX machines have bash. Many important system scripts are written in bash (/etc/rc.*d/ for instance). Also, your start up scripts are written in bash.
The Start of the Program: All shell programs should start with the line "#!/bin/bash". This tells the kernel to hand the script to /bin/bash, and not to try and run it as if it were a binary. Also, don't forget to set the execute bit.
Variables: You can use any reasonable variable name. All variables are of type 'string'. You never need delcare a variable before use. To get the value of a variable, put a "$" in front of it. To set a value, omit the "$". for instance ...
a=4 echo $a
Control Structures: Bash has all the standard control structures. Notice that the if stuff is somewhat weird. For instance ...
while [ $a = 4 ]; do echo $a done for a in /usr/bin/* do rm $a done if [ $a = 4 ]; then echo Hi There fi if [ $a = 4 ]; then echo A is four else echo A is not four fi if [ $a = 4]; then echo A is four elsif [ $b = 4 ]; then echo B is four fi
Arithmetic Expressions: You will rarely need these, but here they are. Do math by running the expr program. Spaces are REQUIRED around all operands and operators of an expression. Remember that '*' is a reserved symbol.
let a=$a+1
a=`expr 3 +$a`
Boolean Tests: There are a million of these. See
"man test" for more details. Here are some examples
|
Less than |
$a < $b |
|
Greater than |
$a > $b |
|
File Exists |
-f $file |
|
Dir Exists |
-d $dir |
Special Variables
There are many variables automatically set by the shell for your
use. These variables normally are read only, and tell useful
things abut the state of the system.
|
PWD |
The present working directory |
|
SHLVL |
Shell level -- incremented one each time -- great for recursion |
|
UID |
The User ID of the current user |
|
LINENO |
The line number currently running -- Use for debuging |
|
PATH |
The search path for commands |
|
HOME |
The home directory |
|
CDPATH |
The search path for the CD command |
|
PS1 |
The primary shell prompt |
|
PS2 |
The secondary shell prompt -- only used when you press return inside a quoe or block |
|
PROMPT_COMMAND |
A command that runs every time a primary prompt is displayed |
|
noclobber |
The shell will refuse to overwrite a file with ">". |
|
$$ |
The current process IS of the shell -- used for temporary files |
Temporary Files
It is a programing mistake to hardcode
temporary filenames in a shell script. Consider what might
happen if two people run the script at the same time! Instead,
use "$$" to make each name unique. For instance,
don't use the temporary file "/tmp/backup", use
/"tmp/backup.$$".
Doing math in Bash
There are lots of ways. See https://www.shell-tips.com/2010/06/14/performing-math-calculation-in-bash/. But really, when you can just use 'let'.
Fake Input and Fake Output
Sometimes you
will want to run a program, but not want to see it's output.
Luckily, and data sent to the special device /dev/null will be
ignorred. Other times a program insists on reading data, but
will happily accept all zeros. The special file /dev/zero
consists of an infinite number of zeros. For example
funnyprogram < /dev/zero > /dev/null
Redirecting Errors
You can redirect an error message
with "2>". This is a great way to build log files
of errors. For example, to run ls but not see any error messages, try
ls /alfj /tmp 2> /dev/null
Lists
One neat trick is to make a 'list' and then get
data from the 'list'. For example,
(cd
/home; tar cf - . ) | ( cd /newhome; tar xf - )