Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被两个反引号包含,注意这个字符不是常用的单引号,在 Esc 键下边
算数运算符
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
[root@yaoguang ~]# a=10
[root@yaoguang ~]# b=20
[root@yaoguang ~]# expr $a + $b
30
[root@yaoguang ~]# expr $a - $b
-10
[root@yaoguang ~]# expr $a \* $b
200
[root@yaoguang ~]# expr $a / $b
0
[root@yaoguang ~]# expr $a % $b
10
结果赋值给变量
[root@yaoguang ~]# abc=$`expr $a + $b`
[root@yaoguang ~]# echo $abc
$30
取出IP地址并赋值
查看当前网卡信息
[root@yaoguang ~]# ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.0.207 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::f816:3eff:fe18:eeb prefixlen 64 scopeid 0x20
ether fa:16:3e:18:0e:eb txqueuelen 1000 (Ethernet)
RX packets 19586 bytes 4505941 (4.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16725 bytes 2858693 (2.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 14 bytes 1332 (1.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 1332 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
取出ip赋值
[root@yaoguang ~]# IPADDR=$(ifconfig eth0 | grep "inet" |head -n 1 |awk '{print $2}')
[root@yaoguang ~]# echo $IPADDR
192.168.0.207
特殊字符
双引号
保留存在的空格或特殊字符,当值存在特殊字符或这空格是,不加双引号不能辅赋值。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
实例1
[root@yaoguang ~]# webserve=nginx 1.11
-bash: 1.11: command not found
[root@yaoguang ~]# echo $webserve
[root@yaoguang ~]# webserve="nginx 1.11"
[root@yaoguang ~]# echo $webserve
nginx 1.11
实例2
[root@yaoguang ~]# linux=8.2
[root@yaoguang ~]# system="CentOS $linux"
[root@yaoguang ~]# echo $system
CentOS 8.2
单引号
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
反引号
主要使用与命令替换,允许将某个命令的屏幕输出结果赋值给变量
使用反引号很难在一条命令中实现嵌套命令的使用