Shell Syntax - what is your input means to the shell
Shell Operations - what can shell do
- read input from file
- breaks the input into words and operations
- parse the token into simple and compound commands
- performs the various shell expansions
- redirections
- execute the commands
- wait for command to complete and collect the exit status
Quoting - remove the special meaning from characters
Escape Character
A non-quoted backslash \ is the Base escape character. It preserves the literal value of the next character that follows.
除了 \newline 有特殊意义。其他都表示转义。
Single Quotes
Enclosing characters in single quotes(') perserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when proceded by a backslash.
Double Quotes
Enclosing characters in double quotes (") perserves the literal value of all characters within the quotes, with the exception of $, ```, \.
ANSI-C Quoting
\a alert
\e \E an escape character
\n newline
$(command) is the modern synonym for command , $() will evaluate this command result and then evaluate the reset of line.
echo $(pwd)/file
with be
echo /path/to/file
Curly braces (${}) are also unconditionally required when
- expanding array elements, as in
${array[2]}
Shell Commands - the types of commands you can use
Shell Functions - the way you group commands by name
Two ways to define a function:
function functname {
}
or
functionName() {
}
Shell Parameters - how shell stores values
Shell Expansions - how bash expands parameters and the various expansions available
Redirections - a way to control where input and output go
Executing Commands - what happens when you run a command
Shell Scripts - executing files of shell commands
Double parentheses
Double parentheses are used for arithmetic operations:
((a++))
((meaning = 42))
for ((i=0; i<10; i++))
echo $((a + b + (14 * c)))
Bash built-in variables
if we have file test.sh
#! /bin/sh
echo '$#' $#
echo '$@' $@
echo '$?' $?
then run:
> ./test.sh 1 2 3
We will get:
$# 3
$@ 1 2 3
$? 0
Explain:
$# = number of arguments. Answer is 3
$@ = what parameters were passed. Answer is 1 2 3
$? = was last command successful. Answer is 0 which means 'yes'
Tips
看一些 shell 脚本的时候发现了如下的写法
VAR1=${VAR1:-VAR2}
这个语句允许当 VAR1 为空时用 VAR2 来赋值。
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted.
Otherwise, the value of parameter is substituted.
这个在 Bash 中叫做 parameter expansion ,更多的内容可以参考 Bash Hacker’s Wiki
使用举例
当 variable 不存在时,会默认使用后者
$ echo "$VAR1"
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
default value
当 variable 存在时,则使用前者
$ VAR1="has value"
$ echo "$VAR1"
has value
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
has value