shell基础编程

1、基础正则表达式

元 字  符   作 用
* 前一个字符匹配 0 次或任意多次。
. 匹配除了换行符外任意一个字符。
^ 匹配行首。例如:^hello 会匹配以 hello 开头的行。
$ 匹配行尾。例如:hello&会匹配以 hello 结尾的行。
[]  匹配中括号中指定的任意一个字符,只匹配一个字符。 例如:[aoeiu] 匹配任意一个元音字母,[0-9] 匹配任意一位数字, [a-z][0-9]匹配小写字和一位数字构成的两位字符。
[^] 匹配除中括号的字符以外的任意一个字符。例如:[^0-9] 匹配任意 一位非数字字符,[^a-z] 表示任意一位非小写字母。
\ 转义符。用于取消讲特殊符号的含义取消。
\{n\} 表示其前面的字符恰好出现 n 次。例如:[0-9]\{4\} 匹配 4 位数字, [1][3-8][0-9]\{9\} 匹配手机号码。
\{n,\} 表示其前面的字符出现不小于 n 次。例如: [0-9]\{2,\} 表示两位 及以上的数字。
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\} 匹配 6 到 8 位的小写字母。

注:在~/.bashrc 文件中建立这个别名:

[root@localhost ~]# vi /root/.bashrc

alias grep='grep --color=auto'

  1)练习文件建立

[root@localhost ~]# vi test_rule.txt

Mr. Li Ming said:

he was the most honest man. 1

23despise him.
But since Mr. shen Chao came,

he never saaaid those words.

5555nice! because,actuaaaally,

Mr. Shen Chao is the most honest man

Later,Mr. Li ming soid his hot body.

   2)“*”前一个字符匹配 0 次,或任意多次

[root@template-host ~]# grep "a*" test_rule.txt 
Mr. Li Ming said:

he was the most honest man. 1

23despise him.
But since Mr. shen Chao came,

he never saaaid those words.

5555nice! because,actuaaaally,

Mr. Shen Chao is the most honest man

Later,Mr. Li ming soid his hot body.

  如果这样写正则表达式“aa*”代表这行字符串一定要有一个 a,但是后面有没有 a 都可以。也就是说 会匹配至少包含有一个 a 的行:

[root@template-host ~]# grep "aa*" test_rule.txt 
Mr. Li Ming said:
he was the most honest man. 1
But since Mr. shen Chao came,
he never saaaid those words.
5555nice! because,actuaaaally,
Mr. Shen Chao is the most honest man
Later,Mr. Li ming soid his hot body.

  如果正则表达式是“aaa*”,则会匹配最少包含两个连续 a 的字符串,如:

[root@template-host ~]# grep "aaa*" test_rule.txt 
he never saaaid those words.
5555nice! because,actuaaaally,

  如果正则表达式是“aaaaa*”,则会匹配最少包含四个个连续 a 的字符串,如:

[root@template-host ~]# grep "aaaaa*" test_rule.txt 
5555nice! because,actuaaaally,

  当然如果再多写一个 a,如“aaaaaa*”就不能从这篇文档中匹配任何内容了,因为我们这篇文档 中 a 最多的单词“actuaaaally”只有四个个连续的 a,而“aaaaaa*”会匹配最少五个连续的 a。

  3)“.” 匹配除了换行符外任意一个字符(正则表达式“.”只能匹配一个字符,这个字符可以是任意字符)

[root@template-host ~]# grep "s..d" test_rule.txt 
Mr. Li Ming said:
Later,Mr. Li ming soid his hot body.


[root@template-host ~]# grep "s.*d" test_rule.txt 
Mr. Li Ming said:
he never saaaid those words.
Later,Mr. Li ming soid his hot body.

  4)“^”匹配行首,“$”匹配行尾 “^”代表匹配行首,比如“^M”会匹配以大写“M”开头的行、“$”代表匹配行尾,如果“n$”会匹配以小写“n”结尾的行、而“^$”则会匹配空白行

[root@template-host ~]# grep "^M" test_rule.txt 
Mr. Li Ming said:
Mr. Shen Chao is the most honest man
[root@template-host ~]# grep "n$" test_rule.txt 
Mr. Shen Chao is the most honest man
[root@template-host ~]# grep -n "^$" test_rule.txt 
2:
4:
7:
9:
11:
13:                 
#因为shell中显示了行号,所以将空白行的行号打印出来了

  5)“[]” 匹配中括号中指定的任意一个字符,只匹配一个字符 “[]”会匹配中括号中指定任意一个字符,注意只能匹配一个字符。比如[ao]要不会匹配一个 a 字符,要不会匹配一个 o 字符:

[root@template-host ~]#  grep "s[ao]id" test_rule.txt 
Mr. Li Ming said:
Later,Mr. Li ming soid his hot body.

  而“[0-9]”会匹配任意一个数字:

[root@template-host ~]# grep "[0-9]" test_rule.txt 
he was the most honest man. 1
23despise him.
5555nice! because,actuaaaally,

  “[A-Z]”则会匹配一个大写字母、

[root@template-host ~]# grep "[A-Z]" test_rule.txt 
Mr. Li Ming said:
But since Mr. shen Chao came,
Mr. Shen Chao is the most honest man
Later,Mr. Li ming soid his hot body.
[root@template-host ~]# 

  “^[a-z]”代表匹配用小写字母开头的行

[root@template-host ~]# grep "^[a-z]" test_rule.txt 
he was the most honest man. 1
he never saaaid those words.

  6)“[^]” 匹配除中括号的字符以外的任意一个字符

[root@template-host ~]# grep "^[a-zA-Z]" test_rule.txt 
Mr. Li Ming said:
he was the most honest man. 1
But since Mr. shen Chao came,
he never saaaid those words.
Mr. Shen Chao is the most honest man
Later,Mr. Li ming soid his hot body.
[root@template-host ~]# grep "^[^a-zA-Z]" test_rule.txt 
23despise him.
5555nice! because,actuaaaally,

  7)“\” 转义符

[root@template-host ~]# grep "\.$" test_rule.txt 
23despise him.
he never saaaid those words.
Later,Mr. Li ming soid his hot body.

  8)“\{n\}”表示其前面的字符恰好出现 n 次

[root@template-host ~]# grep "a\{3\}" test_rule.txt 
he never saaaid those words.
5555nice! because,actuaaaally,

  上面的两行都包含三个连续的 a,所以都会匹配。但是如果先要只显示三个连续的 a,可以这样 来写正则:

[root@template-host ~]# grep "[su]a\{3\}[i1]" test_rule.txt 
he never saaaid those words.

  如果正则是“[0-9]\{3\}”则会匹配包含连续的三个数字的字符串:

[root@template-host ~]# grep "[0-9]\{3\}" test_rule.txt 
5555nice! because,actuaaaally,

  虽然“5555”有四个连续的数字,但是包含三个连续的数字,所以也是可以列出的。可是这样不 能体现出来“[0-9]\{3\}”只能匹配三个连续的数字,而不能匹配四个连续的数字。那么正则就应该 这样来写“^[0-9]\{3\}[a-z]”:

[root@template-host ~]# grep "[0-9]\{3\}[a-z]" test_rule.txt 
5555nice! because,actuaaaally,

  9)“\{n,\}”表示其前面的字符出现不小于 n 次

  “\{n,\}”会匹配前面的字符出现最少 n 次。比如“zo\{3,\}m”这个正则就会匹配用 z 开头,m 结尾,中间最少有三个 o 的字符串。那么“^[0-9]\{3,\}[a-z]”这个正则就能匹配最少用连续三个 数字开头的字符串:

[root@template-host ~]# grep "^[0-9]\{3,\}[a-z]" test_rule.txt 
5555nice! because,actuaaaally,

  而“[su]a\{3,\}[il]”正则则会匹配在字母 s 或 u 和 i 或 l 之间,最少出现三个连续的 a 的字 符串

[root@template-host ~]#  grep "[su]a\{3,\}[il]" test_rule.txt 
he never saaaid those words.
5555nice! because,actuaaaally,

  10)“\{n,m\}”匹配其前面的字符至少出现 n 次,最多出现 m 次

[root@template-host ~]#  grep "sa\{1,3\}i" test_rule.txt 
Mr. Li Ming said:
he never saaaid those words.
#匹配在字母 s 和字母 i 之间有最少一个 a,最多三个 a

2、扩展正则表达式

扩展元字符 作用
+ 前一个字符匹配 1 次或任意多次。 如“go+gle”会匹配“gogle”、“google”或“gooogle”,当然如 果“o”有更多个,也能匹配。
前一个字符匹配 0 次或 1 次。如“colou?r”可以匹配“colour”或“color”。
| 匹配两个或多个分支选择。 如“was|his”会匹配既包含“was”的行,也匹配包含“his”的行。
()

匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组 成的大字符。 如“(dog)+”会匹配“dog”、“dogdog”、“dogdogdog”等,

因为 被()包含的字符会当成一个整体。但“hello (world|earth)” 会匹配“hello world”及“hello earth”。

 

3、字符串截取命令

  1)cut 列提取命令

[root@localhost ~]# cut [选项] 文件名
选项:
-f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割列
-c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段
提取。“n-”表示从第 n 个字符到行尾;“n-m”从第 n 个字符到第 m
个字符;“-m”表示从第 1 个字符到第 m 个字符。

  注:cut 命令的默认分隔符是制表符,也就是“tab”键

[root@template-host ~]# cat student.sh 
ID	Name	PHP	Linux	MySQL	Average
1	lm	89	45	60	90.45
2	sc	70	56	34	89.45
4	tg	99	70	90	100.67
[root@template-host ~]# cut -f 2,3 student.sh 
Name	PHP
lm	89
sc	70
tg	99

#提取第二第三列内容
以“:”作为分隔符,提取/etc/passwd 文件的第一列和第三列
[root@template-host ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
moclbuild:x:1000:1000::/home/moclbuild:/bin/bash
mockbuild:x:1001:1000::/home/mockbuild:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
rabbitmq:x:998:996:RabbitMQ messaging server:/var/lib/rabbitmq:/sbin/nologin
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
[root@template-host ~]# cut -d ":" -f 1,3 /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-network:192
dbus:81
polkitd:999
sshd:74
postfix:89
moclbuild:1000
mockbuild:1001
apache:48
rabbitmq:998
postgres:26
#以“:”作为分隔符,提取/etc/passwd 文件的第一列和第三列

  

  2)awk编程

    a)printf 格式化输出

[root@localhost ~]# printf ‘输出类型输出格式’ 输出内容
输出类型:
%ns: 输出字符串。n 是数字指代输出几个字符
%ni: 输出整数。n 是数字指代输出几个数字
%m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f
代表共输出 8 位数,其中 2 位是小数,6 位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键,也就是 Backspace 键
\f: 清除屏幕
\n: 换行
\r: 回车,也就是 Enter 键
\t: 水平输出退格键,也就是 Tab 键
\v: 垂直输出退格键,也就是 Tab 键

    b)printf 命令输出如果不指定输出格式,则会把所有输出内容连在 一起输出。其实文本的输出本身就是这样的,cat 等文本输出命令之所以可以按照格式漂亮的输出, 那是因为 cat 命令已经设定了输出格式。

[root@template-host ~]# printf '%s' $(cat student.sh)
IDNamePHPLinuxMySQLAverage1lm89456090.452sc70563489.454tg997090100.67

     那么为了用 printf 输出合理的格式,应该这样做:

[root@template-host ~]# printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.sh)
ID	 Name	 PHP	 Linux	 MySQL	 Average	 
1	 lm	 89	 45	 60	 90.45	 
2	 sc	 70	 56	 34	 89.45	 
4	 tg	 99	 70	 90	 100.67

    c)awk基本使用

[root@localhost ~]# awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名
条件(Pattern):
一般使用关系表达式作为条件。这些关系表达式非常多,例如:
x > 10 判断变量 x 是否大于 10
x == y 判断变量 x 是否等于变量 y
A ~ B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A !~ B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
动作(Action):
格式化输出
流程控制语句

  

[root@template-host ~]# awk '{printf $2 "\t" $6 "\n"}' student.sh 
Name	Average
lm	90.45
sc	89.45
tg	100.67

  比如刚刚截取 df 命令的结果时,cut 命令已经力不从心了,我们来看看 awk 命令

[root@template-host ~]# df -h |awk  '{print $1 "\t" $3}' student.sh 
ID	PHP
1	89
2	70
4	99

     d)awk 的条件

条件的类型  条件 说明
awk保留字  BEGIN 在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN 后 的动作只在程序开始时执行一次
END 在 awk 程序处理完所有数据,即将结束时执行。END 后的动作 只在程序结束时执行一次
关系运算符 > 大于
< 小于
>= 大于等于
<= 小于等于
== 等于,用于判断两个值是否相等,如果是给变量赋值,请使用 “=”号
!= 不等于
A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
正则表达式 /正则/ 如果在“//”中可以写入字符,也可以支持正则表达式

  注:BEGIN

BEGIN 是 awk 的保留字,是一种特殊的条件类型。BEGIN 的执行时机是“在 awk 程序一开始时, 尚未读取任何数据之前执行”。一旦 BEGIN 后的动作执行一次,当 awk 开始从文件中读入数据,BEGIN 的条件就不再成立,所以 BEGIN 定义的动作只能被执行一次

[root@template-host ~]#  awk 'BEGIN{printf "This is a transcript \n" }
{printf $2 "\t" $6 "\n"}' student.sh 
This is a transcript 
Name	Average
lm	90.45
sc	89.45
tg	100.67

  注 :END

END 也是 awk 保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时 执行。END 后的动作只在程序结束时执行一次。

[root@template-host ~]#  awk 'END{printf "This is a transcript \n" }
{printf $2 "\t" $6 "\n"}' student.sh 
Name	Average
lm	90.45
sc	89.45
tg	100.67
This is a transcript 

  3)sed 命令:sed 主要是用来将数据进行选取、替换、删除、新增的命令

[root@localhost ~]# sed [选项] ‘[动作]’ 文件名
选项:
-n: 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会
把经过 sed 命令处理的行输出到屏幕。
-e: 允许对输入数据应用多条 sed 命令编辑。
-f 脚本文件名: 从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。
-r: 在 sed 中支持扩展正则表达式。
-i: 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,
每行末尾需要用“\”代表数据未完结。
c \: 行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行
外,每行末尾需用“\”代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,
每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行。
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/
旧字串/新字串/g”(和 vim 中的替换格式类似)。

  例如:输出第二行

[root@template-host ~]# sed -n "2p" student.sh 
1	lm	89	45	60	90.45

3、字符处理命令

1、排序命令sort

[root@localhost ~]# sort [选项] 文件名
选项:
-f: 忽略大小写
-b: 忽略每行前面的空白部分
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-u: 删除重复行。就是 uniq 命令
-t: 指定分隔符,默认是分隔符是制表符

2、uniq:uniq 命令是用来取消重复行的命令,其实和“sort -u”选项是一样的。

[root@localhost ~]# uniq [选项] 文件名
选项:
-i: 忽略大小写

3、统计命令 wc

[root@localhost ~]# wc [选项] 文件名
选项:
-l: 只统计行数
-w: 只统计单词数
-m: 只统计字符数

 4、条件判断

1、按照文件类型进行判断

测试选项  作用
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件  判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)
[root@localhost ~]# [ -e /root/sh/ ]
[root@localhost ~]# echo $?
0
#判断结果为 0,/root/sh/目录是存在的
[root@localhost ~]# [ -e /root/test ]
[root@localhost ~]# echo $?
1
#在/root/下并没有 test 文件或目录,所以“$?”的返回值为非零

 

2、按照文件权限进行判断

测试选项 作用
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件 判断该文件是否存在,并且是否该文件拥有 SUID 权限(有 SUID 权限为真)
-g 文件 判断该文件是否存在,并且是否该文件拥有 SGID 权限(有 SGID 权限为真)
-k 文件 判断该文件是否存在,并且是否该文件拥有 SBit 权限(有 SBit 权限为真)
[root@localhost ~]# ll student.txt
-rw-r--r--. 1 root root 97 6 月 7 07:34 student.txt
[root@localhost ~]# [ -w student.txt ] && echo "yes" || echo "no"
yes
#判断文件是拥有写权限的

  

3、两个文件之间进行比较

测试选项  作用
文件 1 -nt 文件 2 判断文件 1 的修改时间是否比文件 2 的新(如果新则为真)
文件 1 -ot 文件 2 判断文件 1 的修改时间是否比文件 2 的旧(如果旧则为真)
文件 1 -ef 文件 2 判断文件 1 是否和文件 2 的 Inode 号一致,可以理解为两个文件是否 为同一个文件。这个判断用于判断硬链接是很好的方法
#我们一直很苦恼,到底该如何判断两个文件是否是硬链接呢?这时 test 就派上用场了:
[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
#创建个硬链接吧
[root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no" 

  

4、两个整数之间比较

测试选项 作用
整数 1 -eq 整数 2 判断整数 1 是否和整数 2 相等(相等为真)
整数 1 -ne 整数 2 判断整数 1 是否和整数 2 不相等(不相等位置)
整数 1 -gt 整数 2 判断整数 1 是否大于整数 2(大于为真)
整数 1 -lt 整数 2 判断整数 1 是否小于整数 2(小于位置)
整数 1 -ge 整数 2 判断整数 1 是否大于等于整数 2(大于等于为真)
整数 1 -le 整数 2 判断整数 1 是否小于等于整数 2(小于等于为真)
[root@localhost ~]# [ 23 -ge 22 ] && echo "yes" || echo "no"
yes
#判断 23 是否大于等于 22,当然是了
[root@localhost ~]# [ 23 -le 22 ] && echo "yes" || echo "no"
no
#判断 23 是否小于等于 22,当然不是了

 

5、字符串的判断

测试选项  作用
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空(非空返回真)
字串 1 ==字串 2 判断字符串 1 是否和字符串 2 相等(相等返回真)
字串 1 !=字串 2 判断字符串 1 是否和字符串 2 不相等(不相等返回真)
[root@localhost ~]# name=sc
#给 name 变量赋值
[root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no"
no
#判断 name 变量是否为空,因为不为空,所以返回 no
#再来看看如何判断两个字符串相等:
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量 aa 和变量 bb 赋值
[root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no"
no
#判断两个变量的值是否相等,明显不相等,所以返回 no

  

6、多重条件判断

测试选项 作用
判断 1 -a 判断 2 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
判断 1 -o 判断 2 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
!判断 逻辑非,使原始的判断式取反
[root@localhost ~]# aa=11
#给变量 aa 赋值
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
no
#判断变量 aa 是否有值,同时判断变量 aa 的是否大于 23
#因为变量 aa 的值不大于 23,所以虽然第一个判断值为真,返回的结果也是假
#要想让刚刚的判断式返回真,需要给变量 aa 重新赋个大于 23 的值:
[root@localhost ~]# aa=24
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
yes
#再来看看逻辑非是什么样子的:
[root@localhost ~]# [ ! -n "$aa" ] && echo "yes" || echo "no"
no
#本来“-n”选项是变量 aa 不为空,返回值就是真。
#加入!之后,判断值就会取反,所以当变量 aa 有值时,返回值是假
#注意:“!”和“-n”之间必须加入空格,否则会报错的。

5、流程控制

1、if条件判断

单分支 if 条件语句
单分支条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事
情都不做。语法如下:
        if [ 条件判断式 ];then
          程序
        fi
单分支条件语句需要注意几个点:
 if 语句使用 fi 结尾,和一般语言使用大括号结尾不同
 [ 条件判断式 ]就是使用 test 命令判断,所以中括号和条件判断式之间必须有空格
 then 后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,
就不需要“;”了,比如单分支 if 语句还可以这样写:
        if [ 条件判断式 ]
          then
            程序
        fi  

2、双分支if语句

if [ 条件判断式 ]
  then
条件成立时,执行的程序
  else
条件不成立时,执行的另一个程序
fi

3、多分支if语句

if [ 条件判断式 1 ]
  then
    当条件判断式 1 成立时,执行程序 1
elif [ 条件判断式 2 ]
  then
    当条件判断式 2 成立时,执行程序 2
…省略更多条件…
  else
    当所有条件都不成立时,最后执行此程序
fi

 

posted @ 2021-05-13 14:28  元奇  阅读(108)  评论(0编辑  收藏  举报