入坑 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 |