Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
1.算术运算符
2.关系运算符
3.布尔运算符
4.逻辑运算符
5.字符串运算符
6.文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
output=`expr 10 + 20`
两点注意:
a.表达式和运算符之间要有空格,例如 10+20 是不对的,必须写成 10 + 20,这与我们熟悉的大多数编程语言不
一样。
b.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
一、算术运算符
实例:
#!/bin/bash
#--------------------------------------------
#name:practise14.sh
#author:wdh
#date:20181202
#--------------------------------------------
#算术运算符
echo "算数运算符:"
output=`expr 10 + 20`
echo "两数之和为:$output"
output=`expr 10 - 20`
echo "两数之差为:$output"
output=`expr 10 \* 20`
echo "两数之积为:$output"
output=`expr 20 / 10`
echo "两数之商为:$output"
output=`expr 10 % 20`
echo "取余为:$output"
if [ 10 == 20 ];then
echo "两数相等"
else
echo "两数不相等"
fi
echo "-----------------------"
var_one=10
var_two=20
output=`expr $var_one + $var_two`
echo "两数之和为:$output"
output=`expr $var_one - $var_two`
echo "两数之差为:$output"
output=`expr $var_one \* $var_two`
echo "两数之积为:$output"
output=`expr $var_two / $var_one`
echo "两数之商为:$output"
output=`expr $var_two % $var_one`
echo "取余为:$output"
#判断两个变量是否相等
if [ $var_one == $var_two ];then
echo "两数相等"
else
echo "两数不相等"
fi
#判断两个变量是否不相等
if [ $var_one != $var_two ];then
echo "两数不相等"
else
echo "两数相等"
fi
#变量赋值
var_one=$var_two
if [ $var_one == $var_two ];then
echo "两数相等"
else
echo "两数不相等"
fi
if [ $var_one != $var_two ];then
echo "两数不相等"
else
echo "两数相等"
fi
执行 ./practise14.sh
运行脚本,结果如下:
算数运算符:
两数之和为:30
两数之差为:-10
两数之积为:200
两数之商为:2
取余为:10
两数不相等
-----------------------
两数之和为:30
两数之差为:-10
两数之积为:200
两数之商为:2
取余为:0
两数不相等
两数不相等
两数相等
两数相等
二、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
实例:
#!/bin/bash
#--------------------------------------------
#name:practise15.sh
#author:wdh
#date:20181202
#--------------------------------------------
#关系运算符
echo "关系运算符:"
echo "-eq:检测两个数是否相等,相等返回 true。"
echo "-ne:检测两个数是否不相等,不相等返回 true。"
echo "-gt:检测左边的数是否大于右边的,如果是,则返回 true。"
echo "-lt:检测左边的数是否小于右边的,如果是,则返回 true。"
echo "-ge:检测左边的数是否大于等于右边的,如果是,则返回 true。"
echo "-le:检测左边的数是否小于等于右边的,如果是,则返回 true。"
echo "--------------------------------------------------------"
var_one=20
var_two=20
if [ $var_one -eq $var_two ];then
echo "$var_one -eq $var_two :两数相等"
else
echo "$var_one -eq $var_two :两数不相等"
fi
var_one=10
echo "--------------------------------------------------------"
if [ $var_one -ne $var_two ];then
echo "$var_one -ne $var_two :两数不相等"
else
echo "$var_one -ne $var_two :两数相等"
fi
var_one=30
echo "--------------------------------------------------------"
if [ $var_one -gt $var_two ];then
echo "$var_one -gt $var_two :左边大于右边"
else
echo "$var_one -gt $var_two :左边不大于右边"
fi
var_one=10
echo "--------------------------------------------------------"
if [ $var_one -lt $var_two ];then
echo "$var_one -lt $var_two :左边小于右边"
else
echo "$var_one -lt $var_two :左边不小于右边"
fi
var_one=30
echo "--------------------------------------------------------"
if [ $var_one -ge $var_two ];then
echo "$var_one -ge $var_two :左边大于等于右边"
else
echo "$var_one -ge $var_two :左边小于右边"
fi
var_one=20
echo "--------------------------------------------------------"
if [ $var_one -le $var_two ];then
echo "$var_one -le $var_two :左边小于等于右边"
else
echo "$var_one -le $var_two :左边大于右边"
fi
执行 ./practise15.sh
运行脚本,结果如下:
关系运算符:
-eq:检测两个数是否相等,相等返回 true。
-ne:检测两个数是否不相等,不相等返回 true。
-gt:检测左边的数是否大于右边的,如果是,则返回 true。
-lt:检测左边的数是否小于右边的,如果是,则返回 true。
-ge:检测左边的数是否大于等于右边的,如果是,则返回 true。
-le:检测左边的数是否小于等于右边的,如果是,则返回 true。
--------------------------------------------------------
20 -eq 20 :两数相等
--------------------------------------------------------
10 -ne 20 :两数不相等
--------------------------------------------------------
30 -gt 20 :左边大于右边
--------------------------------------------------------
10 -lt 20 :左边小于右边
--------------------------------------------------------
30 -ge 20 :左边大于等于右边
--------------------------------------------------------
20 -le 20 :左边小于等于右边
三、布尔运算符
实例:
#!/bin/bash
#--------------------------------------------
#name:practise16.sh
#author:wdh
#date:20181202
#--------------------------------------------
#布尔运算符
echo "布尔运算符:"
echo "! 非运算,表达式为 true 则返回 false,否则返回 true。"
echo "-o 或运算,有一个表达式为 true 则返回 true。"
echo "-a 与运算,两个表达式都为 true 才返回 true。"
var_one=10
var_two=20
echo "--------------------------------------------------------"
if [ $var_one -eq $var_two ];then
echo "$var_one -eq $var_two:结果为:true"
else
echo "$var_one -eq $var_two:结果为:false"
fi
echo "--------------------------------------------------------"
if [ ! $var_one -eq $var_two ];then
echo " ! $var_one -eq $var_two:结果为:true"
else
echo " ! $var_one -eq $var_two:结果为:false"
fi
echo "--------------------------------------------------------"
if [ $var_one -gt 15 -o $var_two -gt 15 ];then
echo "$var_one -gt 15 -o $var_two -gt 15:结果为:true"
else
echo "$var_one -gt 15 -o $var_two -gt 15:结果为:false"
fi
echo "--------------------------------------------------------"
if [ $var_one -lt 30 -a $var_two -lt 30 ];then
echo "$var_one -lt 30 -a $var_two -lt 30:结果为:true"
else
echo "$var_one -lt 30 -a $var_two -lt 30:结果为:false"
fi
执行 ./practise16.sh
运行脚本,结果如下:
布尔运算符:
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
--------------------------------------------------------
10 -eq 20:结果为:false
--------------------------------------------------------
! 10 -eq 20:结果为:true
--------------------------------------------------------
10 -gt 15 -o 20 -gt 15:结果为:true
--------------------------------------------------------
10 -lt 30 -a 20 -lt 30:结果为:true
四、逻辑运算符
实例:
#!/bin/bash
#--------------------------------------------
#name:practise17.sh
#author:wdh
#date:20181202
#--------------------------------------------
#逻辑运算符
echo "逻辑运算符:"
echo "&& 逻辑的 AND,表达式两边都为true,才为 true。"
echo "|| 逻辑的 OR,表达式两边有一个为true,则为 true。"
var_one=10
var_two=20
echo "--------------------------------------------------------"
if [[ $var_one -ge 15 && $var_two -ge 15 ]];then
echo "$var_one -ge 15 && $var_two -ge 15:结果是:true"
else
echo "$var_one -ge 15 && $var_two -ge 15:结果是:false"
fi
echo "--------------------------------------------------------"
if [[ $var_one -ge 15 || $var_two -ge 15 ]];then
echo "$var_one -ge 15 || $var_two -ge 15:结果是:true"
else
echo "$var_one -ge 15 || $var_two -ge 15:结果是:false"
fi
执行 ./practise17.sh
运行脚本,结果如下:
逻辑运算符:
&& 逻辑的 AND,表达式两边都为true,才为 true。
|| 逻辑的 OR,表达式两边有一个为true,则为 true。
--------------------------------------------------------
10 -ge 15 && 20 -ge 15:结果是:false
--------------------------------------------------------
10 -ge 15 || 20 -ge 15:结果是:true
五、字符串运算符
实例:
#!/bin/bash
#--------------------------------------------
#name:practise18.sh
#author:wdh
#date:20181202
#--------------------------------------------
#字符串运算符
echo "字符串运算符:"
echo "= 检测两个字符串是否相等,相等返回 true。"
echo "!= 检测两个字符串是否相等,不相等返回 true。"
echo "-z 检测字符串长度是否为0,为0返回 true。"
echo "-n 检测字符串长度是否为0,不为0返回 true。"
echo "str 检测字符串是否为空,不为空返回 true。"
var_one="Shell"
var_two="C++"
var_two="Shell"
echo "--------------------------------------------------------"
if [ $var_one = $var_two ];then
echo "$var_one = $var_two:结果是:true"
else
echo "$var_one = $var_two:结果是:false"
fi
var_two="C++"
echo "--------------------------------------------------------"
if [ $var_one != $var_two ];then
echo "$var_one != $var_two:结果是:true"
else
echo "$var_one != $var_two:结果是:false"
fi
var_three=""
echo "--------------------------------------------------------"
if [ -z $var_three ];then
#echo " -z $var_three:结果是:true"
echo 'var_three是空串!'
else
echo " -z $var_three:结果是:false"
fi
var_three="best"
echo "--------------------------------------------------------"
if [ -n $var_three ];then
echo " -n $var_three:结果是:true"
else
echo " -n $var_three:结果是:false"
fi
echo "--------------------------------------------------------"
if [ $var_three ];then
echo " $var_three:结果是:true"
else
#echo " $var_three:结果是:false"
echo 'var_three是空串!'
fi
var_three=""
echo "--------------------------------------------------------"
if [ $var_three ];then
echo "$var_three:结果是:true"
else
#echo "$var_three:结果是:false"
echo 'var_three是空串!'
fi
执行 ./practise18.sh
运行脚本,结果如下:
字符串运算符:
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否相等,不相等返回 true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否为0,不为0返回 true。
str 检测字符串是否为空,不为空返回 true。
--------------------------------------------------------
Shell = Shell:结果是:true
--------------------------------------------------------
Shell != C++:结果是:true
--------------------------------------------------------
var_three是空串!
--------------------------------------------------------
-n best:结果是:true
--------------------------------------------------------
best:结果是:true
--------------------------------------------------------
var_three是空串!
六、文件测试运算符
实例:
#!/bin/bash
#--------------------------------------------
#name:practise19.sh
#author:wdh
#date:20181202
#--------------------------------------------
#文件测试运算符
echo "文件测试运算符:"
echo "-b file:检测文件是否是块设备文件,如果是,则返回 true。"
echo "-c file:检测文件是否是字符设备文件,如果是,则返回 true。"
echo "-d file:检测文件是否是目录,如果是,则返回 true。"
echo "-f file:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。"
echo "-g file:检测文件是否设置了 SGID 位,如果是,则返回 true。"
echo "-k file:检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。"
echo "-p file:检测文件是否是有名管道,如果是,则返回 true。"
echo "-u file:检测文件是否设置了 SUID 位,如果是,则返回 true。"
echo "-r file:检测文件是否可读,如果是,则返回 true。"
echo "-w file:检测文件是否可写,如果是,则返回 true。"
echo "-x file:检测文件是否可执行,如果是,则返回 true。"
echo "-s file:检测文件是否为空(文件大小是否大于0),不为空返回 true。"
echo "-e file:检测文件(包括目录)是否存在,如果是,则返回 true。"
file="/home/wdh/test.sh"
echo "--------------------------------------------------------"
if [ -r $file ];then
echo "文件可读"
else
echo "文件不可读"
fi
echo "--------------------------------------------------------"
if [ -w $file ];then
echo "文件可写"
else
echo "文件不可写"
fi
echo "--------------------------------------------------------"
if [ -x $file ];then
echo "文件可执行"
else
echo "文件不可执行"
fi
echo "--------------------------------------------------------"
if [ -f $file ];then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
echo "--------------------------------------------------------"
if [ -d $file ];then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
echo "--------------------------------------------------------"
if [ -s $file ];then
echo "文件不为空"
else
echo "文件为空"
fi
echo "--------------------------------------------------------"
if [ -e $file ];then
echo "文件存在"
else
echo "文件不存在"
fi
执行 ./practise19.sh
运行脚本,结果如下:
文件测试运算符:
-b file:检测文件是否是块设备文件,如果是,则返回 true。
-c file:检测文件是否是字符设备文件,如果是,则返回 true。
-d file:检测文件是否是目录,如果是,则返回 true。
-f file:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file:检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file:检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file:检测文件是否是有名管道,如果是,则返回 true。
-u file:检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file:检测文件是否可读,如果是,则返回 true。
-w file:检测文件是否可写,如果是,则返回 true。
-x file:检测文件是否可执行,如果是,则返回 true。
-s file:检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file:检测文件(包括目录)是否存在,如果是,则返回 true。
--------------------------------------------------------
文件可读
--------------------------------------------------------
文件可写
--------------------------------------------------------
文件可执行
--------------------------------------------------------
文件为普通文件
--------------------------------------------------------
文件不是个目录
--------------------------------------------------------
文件不为空
--------------------------------------------------------
文件存在