目录
一、算数运算符
1.expr和let
2.利用 [] 和 (()) 进行数值运算
二、关系运算符-数字
三、布尔运算符和逻辑运算符
四、字符串运算符
五、文件测试运算符
六、实例:统计一个文件系统路径下的目录和文件数量
Shell运算符
算术运算符顾名思义,其就是进行加减乘除数值运算,在 shell 中,bash 不支持原生的数学运算,需要利用第三方工具来如 let
,expr
等来实现。
利用 let
对数值进行运算,let C=$A+$B,
let
运算后需要将其赋值给一个变量。
[root@master ~]# A=1
[root@master ~]# B=2
[root@master ~]# let C=${A}+${B}
[root@master ~]# echo $C
3
利用 expr
对数组进行运算,C=$(expr $A+$B)
,例如:
[root@master ~]# C=`expr $A + $B`
[root@master ~]# echo $C
3
利用 []
来对数值进行运算,C=[A+B]
,例如:
[root@master ~]# C=$[$A+$B]
[root@master ~]# echo $C
3
利用 (())
来对数值进行运算,C=$(($A+$B))
,例如:
[root@master ~]# C=$(($A+$B))
[root@master ~]# echo $C
3
关系运算顾名思义就是比较数字的大小,注意关系运算符作用的为数字,不能用其来比较字符串。
示例:
#!/bin/bash
num1=1
num2=2
echo "num1 为:${num1}"
echo "num2 为: ${num2}"
if [ $num1 -eq $num2 ]
then
echo "${num1} -eq ${num2} : num1 等于 num2"
else
echo "${num1} -eq ${num2} : num1 不等于 num2"
fi
错误示例:比较对象为字符串
[root@localhost /]# sh compare_demo.sh
num1 为:hello_java
num2 为: hello_java
compare_demo.sh: 第 10 行:[: hello_java: 期待整数表达式
hello_java -eq hello_java : num1 不等于 num2
布尔运算符也就是我们常说的与或非,对于布尔运算和逻辑运算其实是一个东西,只不过布尔运算符有一个非运算。
示例:
#!/bin/bash
#
num1=10
num2=20
echo "num1 为:${num1}"
echo "num2 为: ${num2}"
if [ $num1 -lt 40 -a $num2 -gt 15 ]
then
echo "${num1} 小于 40 且 ${num2} 大于 15 : 返回 ture"
else
echo "${num1} 小于 40 且 ${num2} 大于 15 : 返回 false"
fi
逻辑运算符
如果需要在一个 test 中执行多个判断,需要使用 [[]]
, test 是 Shell 内置关键字,不是命令,免除函数传递过程,因此更加建议使用 [[]]
。双中括号有以下注意事项:
""
包围起来,即使变量是空值,也不会出错;与逻辑运算符号对应的 &&
可以使用 -a
,||
可以使用 -o
来替换。
用于对于字符串进行一些判断操作
示例:
#!/bin/bash
#
var1="java"
var2="shell"
var3=""
echo "var1 为:${var1}"
echo "var2 为: ${var2}"
if [ $var1 == $var2 ];then
echo "${var1} = ${var2} : var1 等于 var2"
else
echo "${var1} = ${var2} : var1 不等于 var2"
fi
if [ -n "${var3}" ];then
echo "-n ${var3} : 字符串长度不为0"
else
echo "-n ${var3} : 字符串长度为0"
fi
文件测试在我们编写 shell 中与文件操作非常常用
示例:
#!/bin/bash
#
TEST_FILE="/demo_test.sh"
echo "检测的文件为:${TEST_FILE}"
echo "文件信息为:$(ls -l ${TEST_FILE})"
if [ -r ${TEST_FILE} ];then
echo "${TEST_FILE} : 文件可读"
else
echo "${TEST_FILE} :文件不可读"
fi
#!/bin/bash
#
#判断输入参数
[ $# -ne 1 ] && echo "输入参数错误,${0} check_dir" && exit 1
#判断输入的是否为存在的目录,不存在则退出
CHECK_DIR=$1
[ ! -d ${CHECK_DIR} ] && echo "检测系统不存在目录: ${CHECK_DIR},请输入正确的目录" && exit 1
#对目录文件进行统计
DIR_NUM=0
FILE_NUM=0
OTHER_NUM=0
for item in ${CHECK_DIR}/*
do
if [ -d ${item} ];then
# 如果为目录,目录总数+1
DIR_NUM=$((${DIR_NUM}+1))
elif [ -f ${item} ];then
FILE_NUM=$((${FILE_NUM}+1))
else
OTHER_NUM=$((${OTHER_NUM}+1))
fi
done
echo "检测目录为:${CHECK_DIR}"
echo "目录类型数量为:${DIR_NUM}"
echo "文件类型数量为:${FILE_NUM}"
echo "其他类型数量为:${OTHER_NUM}"