入坑 Linux 以后,命令行也是一个非常重要的工具。本文简单总结一下常用的 bash 语法。

这里只讲纯语法,文件操作、系统工具等可以看 Linux 日常

cheatsheet

  • 变量赋值 = 左右不能有空格
  • if = 左右都要有空格
  • var=$s 等价于 var=${s}
  • var=$(echo 123) 等价于 var=$`echo 123`
  • 多条语句串行执行:echo 1; sleep 1; echo 2
  • 多条语句并行执行:echo 1 & echo 2
  • 多条语句等待前一句正确执行后执行:echo 1 && echo 2
  • 命令行末加 \ 可使得命令跨行
  • for:for ((i=1; i<=10; i ++)); do echo $i; done
  • 或者:for i in {1..10}; do echo $i; done

变量

对变量名的要求和 C/C++ 相同。

1
var=123

注意等号左右都不能有空格。左边有空格,var 会被视为命令;右边有空格,123 会被视为命令。
(而 bash 的 if 则强制要求等号左右必须有空格)

若赋值有空格,可以使用引号括起来,赋值的结果没有引号。

1
2
3
$ var="123 456"
$ echo $var
123 456

在变量名前加 $ 即可。也可以把变量名用大括号括起来。

1
2
echo $var
echo ${var}

值得注意的是,也可以把命令执行的结果看作是一个取值的过程,如下:

1
2
3
4
var=`command`

var=$(command)
echo the current time is $(date +%c)

后者支持嵌套。

输出

echo 使用较简单。

需要看 echo 的帮助请使用 man echo 而不是一般的 echo --help

一行一语句?

bash 默认是一行一条命令。但是某些特殊符号可以打破这个规定:

  1. ; 使得一行多个命令。和一般情况相同的是,命令是串行执行:
1
echo 1; sleep 1; echo 2;

输出 1,停顿一秒,然后输出 2。


  1. & 使得一行多个命令。和一般情况相同的是,命令是并行执行:
1
echo 1; sleep 1 & echo 2

这里的 echo 2sleep 1 同时执行,所以用户并不会感觉输出 12 间出现了停顿。

bash 的具体实现是,会创建一个新进程执行 & 前的代码(同时会将新进程的 pid 显示在屏幕上如 [1] 174),然后主进程继续执行这行之后的代码。

顺便,这里的 & 配合 for 可以实现并行 for 语句。nb!


  1. && 使得一行多个命令。但是,只有前面的命令没有出错,才会执行后面的命令。(显然命令需要串行执行):
1
2
3
4
5
ping localhost -c 1 && echo 2
# ping 成功执行,然后输出 2

ping whatthefuck -c 1 && echo 2
# ping 失败,不输出 2
  1. \ 使得多行一个命令。常用于参数较多时,将命令参数分行写。
1
2
3
4
5
6
ffmpeg \
-allowed_extensions ALL \
-hwaccel cuda -i \
117652-8.m3u8 \
-c:v h264_nvenc \
8.mp4

流程控制

条件判断

循环

有个 C 语言风格的:

1
2
3
4
for ((i=1; i<=10; i ++))
do
echo $i
done

写成一行的版本:

1
for ((i=1; i<=10; i ++)); do echo $i; done

除此之外,还有:

1
2
3
4
for i in {1..10}
do
echo $i # 显示 1 至 10
done

同样可以写为单行的版本:

1
for i in {1..10}; do echo $i; done