#表达式与运算符

##1.1 基本算术运算

代码内容:

#!/bin/bash

a=10
b=20

# 加法
ret=`expr $a + $b`
echo "a + b : $ret"

# 减法
ret=`expr $a - $b`
echo "a - b : $ret"

# 乘法
ret=`expr $a \* $b`
echo "a * b : $ret"

# 除法
ret=`expr $b / $a`
echo "b / a : $ret"

# 取余除
ret=`expr $b % $a`
echo "b % a : $ret"

运行情况:
图片描述

##1.2 逻辑运算

代码内容:

#!/bin/bash

a=10
b=20

ret=`expr $a < $b`
echo "a < b : $ret"

ret=`expr $a = $b`
echo "a = b : $ret"

ret=`expr $a != $b`
echo "a != b : $ret"

ret=`expr $b >= $a`
echo "b >= a : $ret"

运行情况:
图片描述

由图可以看出,该代码出错。报错信息为:expr语法错误。故可以看出,当直接用expr进行大小比较时,会出错。<,>会被shell误解,因此,可采用添加转义字符\的方式进行处理。echo使用的不是三元运算符,这只是一个简单的比大小。
更改后的代码如下:

#!/bin/bash

a=10
b=20

ret=`expr $a \< $b`
echo "a < b : $ret"

ret=`expr $a = $b`
echo "a = b : $ret"

ret=`expr $a != $b`
echo "a != b : $ret"

ret=`expr $b \>= $a`
echo "b >= a : $ret"

效果如下:
图片描述

##1.3 字符串运算

1.3.1 计算字符串子串

使用方法为:
expr “目标字符串” 子串起始位置 子串长度
效果如下:
图片描述

1.3.2 计算字符串子串首次出现的位置

使用方法为:
expr index “目标字符串” “目标子串”
效果如下:
图片描述

1.3.3 计算字符串长度

使用方法如下:
expr length “目标字符串”
效果如下:
图片描述

##2.1 求值

a=1
b=01
c=2

###2.1.1
test $a = $b
echo $?
结果为1
因为比较的是字符串,1和01字符串不一致

###2.1.2
test $a -eq $b
echo $?
结果是0
因为-eq比较的是数值,因此,1和01相同

###2.1.3
test $a -lt $c
echo $?
结果是0
因为-lt比较的是数值,a是1,c是2,1<2。

###2.1.4
test -n $a
echo $?
结果为0
因为-n检测变量是否为非空,这里a有值,因此结果为0。

###2.1.5
test -z $a
echo $?
结果为1
因为-z检测变量是否为空,这里a有值,因此结果为1。

###2.1.6
test -n $f
echo $?
结果为1
因为-n检测变量是否为非空,这里f未定义,因此结果为1。

###2.1.7
test -z $f
echo $?
结果为0
因为-n检测变量是否为空,这里f未定义,因此结果为0。

##2.2 请写出如下判断所需要的命令,并执行的结果,写入报告。

###2.2.1 判断文件 /usr/sbin/anacron 是否存在,且具有执行权限。
if [ -x /usr/sbin/anacron ]; then
echo 1
else
echo 0
fi
结果为0,即不存在或没有权限。
图片描述

###2.2.2 判断 /dev/sda 磁盘是否是块设备,是块设备则为真。

if [ -b /dev/sda ]; then
echo 1
else
echo 0
fi
结果为0,即/dev/sda 磁不是块设备。
图片描述

###2.2.3 判断变量 a 的值是否在 18 到 28 之间(含18和28)。

a=20
if [ $a -ge 18 ] && [ $a -le 28 ]; then
echo 1
else
echo 0
fi
图片描述

###2.2.4 判断文件是否是空文件,是空文件则为真。
if [ ! -s wenjianming ]; then
echo 1
else
echo 0
fi