Shell编程三-Shell 基本运算符

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。
--------------------------------------------------------
文件可读
--------------------------------------------------------
文件可写
--------------------------------------------------------
文件可执行
--------------------------------------------------------
文件为普通文件
--------------------------------------------------------
文件不是个目录
--------------------------------------------------------
文件不为空
--------------------------------------------------------
文件存在
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值