3 基本的Shell命令
3.1 Redirecting Output
管道重定向：>
对文件追加：>>
For
">", by default, if the file already exists, then it will be
overwritten. If you want to change the default behavior, you can use
the command set -o noclobber (or set -C), which sets the noclobber option to prevent a file from being overwritten using redirection. You can cancel this option using set +o noclobber.
For ">>", outputs are appended to the end of the file.

File descriptor 0 is the standard input to a program, file descriptor 1
is the standard output, and file descriptor 2 is the standard error
output. It’s unusual to want to redirect any other than the standard
ones: 0, 1, and 2.

To redirect the
standard error output, preface the > operator with the number of the
file descriptor you wish to redirect. Because the standard error is on
file descriptor 2, use the 2> operator. This is often useful to
discard error information and prevent it from appearing on the screen.

The command
$kill -HUP 1234 >killout.txt 2>killerr.txt will put the output and error information into separate files. If you prefer to capture both sets of output into a single file, you can use the >& operator to combine the two outputs. Therefore,$ kill -1 1234 >killouterr.txt 2>&1
will
put both the output and error outputs into the same file. Notice the
order of the operators. This reads as “redirect standard output to the
file killouterr.txt, and then direct standard error to the same place
as the standard output.” If you get the order wrong, the redirect won’t
work as you expect.

3.2 Redirecting Input
<

3.3 Pipes
Processes connected by pipes can run simultaneously and are automatically rescheduled as data flows between them.

3.4 file command
The best way to check if a file is a script or not is to use the file command — for example, file first or file /bin/bash.

You can assign user input to a variable by using the read command.The read normally completes when the user presses Enter.
3.6 which

Check which command is used, e.g. which test.

3.7 touch filename
Check whether it exists and create it if it doesn’t.

4 Shell Scripts
4.1 Quoting

If you enclose a $variable expression in double quotes, then it’s replaced with its value when the line is executed. If you enclose it in single quotes, then no substitution takes place. You can also remove the special meaning of the$ symbol by prefacing it with a /.

Usually, strings are enclosed in double quotes, which protects
variables from being separated by whitespace but allows $expansion to take place. 4.2 Environment Variables If you want to check out how the program works in a different environment by running the env <command>, try looking at the env manual pages. 4.3 Parameter Variables If your script is invoked with parameters, some additional variables are created. If no parameters are passed, the environment variable$# still exists but has a value of 0.

As you can see, within double quotes, $@ expands the positional parameters as separate fields, regardless of the IFS value. In general, if you want access to the parameters,$@ is the sensible choice.

4.4 A Problem With Variables
For a script
if [ $timeofday = “yes” ] , if just press "Enter",rather than answer anything.When the variable timeofday was tested, it consisted of a blank string. Therefore, the if clause looks like if [ = “yes” ] which isn't a valid condition. To avoid this, you must use quotes around the variable: if [ “$timeofday” = “yes” ]
An empty variable then gives the valid test:
if [ “” = “yes” ]

Remember
that adding the quotes tells the shell to consider everything between
them as a single string. This is one way of getting spaces to be stored
in a variable.

4.5 The test or [ Command

The [ and test commands are synonymous, except that when the [ command is used, a trailing ] is also used. The test or [ can be used to check to see whether a file exists.
e.g.    test -f <filename> or [ -f <filename> ]
(Note: You must put spaces between the [ braces and the condition being checked.)
Conditions that you can use test command are:
4.6 Control Structures
(1)
if condition
then
statements
elif condition; then
else
statements
fi

(2)

for variable in values
do
statements
done

Note:
for file in $(ls f*.sh); do In this example, the parameter list for the for command is provided by the output of the command enclosed in the$() sequence.

(3)
while condition do
statements
done

(4)
until condition
do
statements
done

Note:    In general, if a loop should always execute at least once, use a while loop; if it may not need to execute at all, use an until loop.

(5)

case variable in
pattern [ | pattern] ...) statements;;
pattern [ | pattern] ...) statements;;
...
esac

Note:

•     Notice
that each pattern line is terminated with double semicolons (;;). You
can put multiple statements between each pattern and the next, so a
double semicolon is needed to mark where one statement ends and the
next pattern begins.

•     Be
careful with the case construct if you are using wildcards such as ‘*‘
in the pattern. The problem is that the first matching pattern will be
taken, even if a later pattern matches more exactly.

(6) Lists

•     AND
List: The AND list construct enables you to execute a series of
commands, executing the next command only if all the previous commands
have succeeded. The syntax is
statement1 && statement2 && statement3 && ...
•     OR
List: The OR list construct enables us to execute a series of commands
until one succeeds, and then not execute any more. The syntax is as
follows:
statement1 || statement2 || statement3 || ...

(7) Statement Blocks
If you want to use multiple statements in a place
where only one is allowed, such as in an AND or OR list, you can do so
by enclosing them in braces {} to make a statement block.

(8) Shell Function
function_name () {

statements

}