1. 变量
- 变量的赋值用 等号, 但是等号间不能有空格
 
1
 foo=42  # sets foo to 42
- 引用变量的值, 用 $ 符号
 
1
echo $foo    # prints 42
2. 数组
- 给数组赋值
 
1
2
3
  foo[0]="one"
  foo[1]="two"
  echo ${foo[1]}  # prints "two"
- 换种方式给数组赋值
 
1
2
3
foo=("a a a" "b b b" "c c c")
echo ${foo[2]}  # prints "c c c"
echo $foo       # prints "a a a"
- 整个数组的赋值 (注意空格时需要用引号)
 
1
2
3
4
5
 foo=("a 1" "b 2" "c 3")
 bar=(${foo[@]})
 baz=("${foo[@]}")
 echo ${bar[1]}            # oops, print "1"
 echo ${baz[1]}            # prints "b 2"
3. 专用变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 echo $0      # 脚本本身的名字
 echo $1      # 传给脚本的第一个参数
 echo $2      # 第2个参数
 echo $9      # 第9个参数
 echo $10     # 第一个参数, 后面跟一个 0
 echo ${10}   # 第10个参数
 echo $#      # 传给脚本的参数总数
 
 echo $?   # prints 0 代表前一个进程退出时返回0, 执行成功
 echo $?   # 非 0; 代表前一个进程退出时返回非0, 执行失败
 
 echo  $$  # 当前 shell 的 进程id
 
- $! 最近运行的背景进程的进程 id
 
1
2
3
4
5
6
7
8
9
# sort two files in parallel:
 sort words > sorted-words &        # launch background process
 p1=$!
 sort -n numbers > sorted-numbers & # launch background process
 p2=$!
 wait $p1
 wait $p2
 echo Both files have been sorted.
 
4. 字符串处理
- 替换
 
1
2
3
 foo="I'm a cat."
 echo ${foo/cat/dog}  # prints "I'm a dog."
 echo $foo                  # still prints "I'm a cat."
- 替换一次和多次
 
1
2
3
 foo="I'm a cat, and she's cat."
 echo ${foo/cat/dog}   # prints "I'm a dog, and she's a cat."
 echo ${foo//cat/dog}  # prints "I'm a dog, and she's a dog."
- 删除
 
1
2
 foo="I like meatballs."
 echo ${foo/balls}       # prints I like meat.
5. 数组长度
1
2
3
4
ARRAY=(abcdd b c)
echo ${#ARRAY}          # prints 5 错误
echo ${#ARRAY[@]}     # prints 3 正确
6. 引号
1
2
3
4
5
world=Earth
foo='Hello, $world!'
bar="Hello, $world!"
echo $foo            # 单引号, prints Hello, $world!
echo $bar            # 双引号, prints Hello, Earth!
Bash Idioms
if 逻辑
1
2
3
# 先判断 DIR 变量长度是否为 0,不为 0 的话,才执行 cd 命令
[[ -n "$DIR" ]] && cd "$DIR"
和下面的写法等价:
1
2
3
if [[ -n "$DIR" ]]; then
    cd "$DIR"
fi