Shell 基本运算符


Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符
    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

两点注意:

  1. 表达式和运算符之间要有空格,例如 2+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. 双引号里可以有变量
  2. 双引号里可以出现转义字符

实例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

单引号

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用

反引号

主要使用与命令替换,允许将某个命令的屏幕输出结果赋值给变量
使用反引号很难在一条命令中实现嵌套命令的使用