首页 Bash Notes
文章
取消

Bash Notes

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

References

本文由作者按照 CC BY 4.0 进行授权