shell第一篇,我们先看看运算符吧,因为这个和我了解的其他语言有点区别,所以先笔记下!
内容参考:菜鸟教程
基本运算符
- 算术运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生的bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。
expr是一款表达式计算工具,使用它能完成表达式求值操作。
例如:a+b -->$a+$b
注意 “`”为半角下的tab键上的按键
注意:
- 表达式和运算符之间要有空格。 正确写法"a + b",错误写法"a+b"
*完成的表达式要被``包含,这个不是单引号,是Esc下方的按键。
算术运算符
直接通过代码演示了,详细的说明可以看菜鸟教程。
# 局部变量
# 注意 变量声明不能带空格
a=10
b=20
# 错误示范 当2+2没有空格的时候
# 打印结果为 a + b : 2+2
val=`expr 2+2`
echo "a + b : $val"
# 下面全部为正确示范
# >>加法
val=`expr $a + $b`
echo "a + b : $val"
# 打印结果 a + b : 30
# >>减法
val=`expr $a - $b`
echo "a - b : $val"
# 打印结果 a - b : -10
# >>乘法 利用\转译下*
val=`expr $a \* $b`
echo "a * b : $val"
# 打印结果 a * b : 200
# >>除法
val=`expr $b / $a`
echo "b / a : $val"
# 打印结果 b / a : 2
# >>取余
val=`expr $b % $a`
echo "b % a : $val"
# 打印结果 b % a : 0
# >>赋值 上面一直在演示,不能带空格
val=$a
echo "a : $val"
# 打印结果 a : 10
# >>相等 用来比较两个数
if [[ $a == $b ]]; then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
# 打印结果 a 不等于 b
# >>不相等 用来比较两个数
if [[ $a != $b ]]; then
echo "a 不等于 b"
else
echo "a 等于 b"
fi
# 打印结果 a 等于 b
- 乘法运算的"*"必须使用""进行转义才能够使用
- if...then...else...fi 是条件语句,同c语言的if...else
- 在mac中shell的expr语法是$((表达式)),这个时候的"*"不需要""进行转义了。
关系运算符
# 局部变量
a=10
b=20
# 练习 -eq 是否相等
if [[ $a -eq $b ]]; then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
fi
# 练习 -ne 是否不相等
if [[ $a -ne $b ]]; then
echo "$a -ne $b : a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
# 练习 -gt 是否大于
if [[ $a -gt $b ]]; then
echo "$a -gt $b : a 大于 b"
else
echo "$a -gt $b : a 不大于 b"
fi
# 练习 -lt 是否小于
if [[ $a -lt $b ]]; then
echo "$a -lt $b : a 小于 b"
else
echo "$a -lt $b : a 不小于 b"
fi
# 练习 -ge 是否大于等于
if [[ $a -ge $b ]]; then
echo "$a -ge $b : a 大于或等于 b"
else
echo "$a -ge $b : a 小于 b"
fi
# 练习 -le 是否小于等于
if [[ $a -le $b ]]; then
echo "$a -le $b : a 小于或等于 b"
else
echo "$a -le $b : a 大于 b"
fi
输出结果:
10 -eq 20 : a 不等于 b
10 -ne 20 : a 不等于 b
10 -gt 20 : a 不大于 b
10 -lt 20 : a 小于 b
10 -ge 20 : a 小于 b
10 -le 20 : a 小于或等于 b
布尔运算符
# 局部变量
a=10
b=20
# ! 非运算
if [[ $a != $b ]]; then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b : a 等于 b"
fi
# -a 与运算
if [ $a -lt 100 -a $b -gt 15 ]; then
echo "$a 小于 100 且 $b 大于15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于15 : 返回 false"
fi
# -o 或运算
if [ $a -lt 100 -o $b -gt 100 ]; then
echo "$a 小于 100 或 $b 大于100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于100 : 返回 false"
fi
# 补充运算
if [ $a -lt 5 -o $b -gt 100 ]; then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
输出结果:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于15 : 返回 true
10 小于 100 或 20 大于100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false
逻辑运算符
# 局部变量
a=10
b=20
# && 逻辑与 ADN
if [[ $a -lt 100 && $b -gt 100 ]]; then
echo "返回 true"
else
echo "返回 false"
fi
# || 逻辑或 OR
if [[ $a -lt 100 || $b -gt 100 ]]; then
echo "返回 true"
else
echo "返回 false"
fi
输出结果:
返回 false
返回 true
字符串运算符
# 局部变量
a="abc"
b="efg"
# = 检查两个字符串是否相等
if [[ $a = $b ]]; then
echo "$a = $b : a 等于 b"
else
echo "$a = $b : a 不等于 b"
fi
# != 检测两个字符串是否不相等
if [[ $a != $b ]]; then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b : a 等于 b"
fi
# -z 检测字符串长度是否为0
if [[ -z $a ]]; then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
# -n 检测字符包长度是否不为0
if [[ -n $a ]]; then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
# str 检测字符串是否不为空
if [[ $a ]]; then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
输出结果:
abc = efg : a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空
文件测试运算符
# 文件路径
file="/Users/lijianping/CodeHome/shell/les01/file.sh"
# -r 检测文件是否可读
if [[ -r $file ]]; then
echo "文件可读"
else
echo "文件不可读"
fi
# -w 检测文件是否可写
if [[ -w $file ]]; then
echo "文件可写"
else
echo "文件不可写"
fi
# -x 检测文件是否可执行
if [[ -x $file ]]; then
echo "文件可执行"
else
echo "文件不可执行"
fi
# -f 文件是否为普通文件 即不是目录,不是设备文件
if [[ -f $file ]]; then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
# -d 检测文件是否为目录
if [[ -d $file ]]; then
echo "文件是个目录"
else
echo "文件不是目录"
fi
# -s 检测文件是否为空 即文件大小是否大于0
if [[ -s $file ]]; then
echo "文件不为空"
else
echo "文件为空"
fi
# -e 检测文件是否存在 包括目录
if [[ -e $file ]]; then
echo "文件存在"
else
echo "文件不存在"
fi
输出结果:
文件可读
文件可写
文件不可执行
文件为普通文件
文件不是目录
文件不为空
文件存在
其他文件测试相关操作符介绍:
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件 |
-c file | 检测文件是否是字符设备文件 |
-g file | 检测文件是否设置了SGID位 |
-k file | 检测文件是否设置了粘着位(Sticky Bit) |
-p file | 检测文件是否是有名管道 |
-u file | 检测文件是否设置了SUID位 |