入坑 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 | $ var="123 456" |
在变量名前加 $ 即可。也可以把变量名用大括号括起来。
1 | echo $var |
值得注意的是,也可以把命令执行的结果看作是一个取值的过程,如下:
1 | var=`command` |
后者支持嵌套。
输出
echo 使用较简单。
需要看 echo 的帮助请使用 man echo 而不是一般的 echo --help。
一行一语句?
bash 默认是一行一条命令。但是某些特殊符号可以打破这个规定:
;使得一行多个命令。和一般情况相同的是,命令是串行执行:
1 | echo 1; sleep 1; echo 2; |
输出 1,停顿一秒,然后输出 2。
&使得一行多个命令。和一般情况相同的是,命令是并行执行:
1 | echo 1; sleep 1 & echo 2 |
这里的 echo 2 和 sleep 1 同时执行,所以用户并不会感觉输出 1 和 2 间出现了停顿。
bash 的具体实现是,会创建一个新进程执行 & 前的代码(同时会将新进程的 pid 显示在屏幕上如 [1] 174),然后主进程继续执行这行之后的代码。
顺便,这里的 & 配合 for 可以实现并行 for 语句。nb!
&&使得一行多个命令。但是,只有前面的命令没有出错,才会执行后面的命令。(显然命令需要串行执行):
1 | ping localhost -c 1 && echo 2 |
\使得多行一个命令。常用于参数较多时,将命令参数分行写。
1 | ffmpeg \ |
流程控制
条件判断
循环
有个 C 语言风格的:
1 | for ((i=1; i<=10; i ++)) |
写成一行的版本:
1 | for ((i=1; i<=10; i ++)); do echo $i; done |
除此之外,还有:
1 | for i in {1..10} |
同样可以写为单行的版本:
1 | for i in {1..10}; do echo $i; done |