0%

基础语法

学习语法的目的

这里介绍的只是一些最基础的基本语法,暂时不用死记,大概过一遍,心里留下点影响。

如果你有能力,记下是最好的。

保留字符(关键字)

在所有的编程语言中,都需要有一个特殊的标记,用来搭建程序的骨架。这些标记就是一些保留字符,他们都有一些特殊含义。

在bash中有如下保留字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if 
elif
else
then
fi
for
in
while
do
done
case
esac
until
function
select
time
{
}
[[
]]
!

这些保留字符需要稍微记一记,总共没几个。

Bash语法

简单命令

什么是简单命令?简单说就是由命令 + 参数(可选)的命令语句。虽然这么说不对,但是方便各位理解。

1
[root@vm-101 ~]# cd /tmp

这就是一条简单命令。cd就是命令,/tmp就是参数。它的作用是进入/tmp目录。

还记得我们在第一个脚本Hello,world!里面提到的退出状态码?标准命令都有。我们来看看这个简单命令的退出状态。

1
2
[root@vm-101 tmp]# echo $?
0

0代表为没有问题,无报错。

1
2
3
4
[root@vm-101 ~]# cd adsf
-bash: cd: adsf: 没有那个文件或目录
[root@vm-101 ~]# echo $?
1

非0代表有错误。

以上是程序运行到最后,自动结束的情况。

另外还有运行到一半,想手动结束的情况。

1
[root@vm-101 tmp]# cat

这个命令是查看文件的内容。但是我在cat命令后面并没有加文件名,所以它会一直等待。这就可以认为是一条简单命令。

我们按Ctrl-C退出。

1
2
$ echo $?
130

这个130是什么意思呢?是bash程序在手动退出的时候(比如:Ctrl-C),退出状态码=128+single。

Ctrl-C就是发送了一个SIGINT信号给程序,告诉它,你该退出了。这个SIGINT的值是2。

所有的默认定义的信号:

1
2
3
4
5
6
7
8
9
>$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE
9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS
>13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG
>17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
>21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU
>25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
>29) SIGINFO 30) SIGUSR1 31) SIGUSR2

管道

管道就是由多个简单命令用管道符组合起来的复合语句。

语法结构如下:

1
2
command1 | command2
command1 |& command2

就像一个流水线,一个人干完他的活(command1),然后交给另外一个人,另外一个再接着干他的活(command2)。两人都干完后,这件事情就做完了。

这里有两种管道操作符。他们有点小小的区别。

|& 会把command1的标准错误输出重定向到command2的标准输入中。等同于command1 2>&1 | command2

| 不会做这个重定向。

管道的退出状态是最后一个command的退出状态。

标准输入 0

标准输出 1

标准错误输出 2

扩展:

管道中的每个command都是在子shell中运行的。暂时不理解没关系。先了解了解这个事情。

命令列表

它有几个简单命令或者管道命令组成,中间用; & && ││连接,以;& 换行结束。

; 和标点符号;类似,用来连接两个可以独立运行的简单命令或者管道命令。

& 后台运行

&& AND的意思。如果command1运行成功,就接着运行command2。如果command1运行失败,command2也不需要运行了。只有全部command都运行成功后,整个命令列表的返回状态才为真。

|| OR的意思。如果command1运行失败,那么就运行command2。如果command1运成功,那么command2就不运行。只要有一个command的返回状态是真,整个命令列表的返回状态就为真。

先来个简单的

1
2
3
[root@vm-101 ~]# echo 111 ; echo 222
111
222
1
2
3
[root@vm-101 ~]# echo 111 && echo 222
111
222
1
2
[root@vm-101 ~]# echo 111 || echo 222
111

这里;和&&看上去结果一样。但是是有本质差别的。

1
2
3
4
5
6
[root@vm-101 ~]# cd asdfadsf ; echo 222
-bash: cd: asdfadsf: 没有那个文件或目录
222

[root@vm-101 ~]# cd asdfadsf && echo 222
-bash: cd: asdfadsf: 没有那个文件或目录

Command1 发生错误是,;语句中的command2还是会继续执行。而&&语句中就不会执行。