首页 > 系统相关 >【Shell脚本(二) -- 运算符】

【Shell脚本(二) -- 运算符】

时间:2022-12-11 15:01:13浏览次数:41  
标签:Shell 20 -- echo 运算符 gt 100 else true

一、Shell 基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

二、算术运算符

1、+ 、-、*、 /、 加减乘除
2、% 取余
3、= 赋值
4、== 判断是否相等。用于比较两个数字,相同则返回 true。
5、!= 判断不相等。用于比较两个数字,不相同则返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

#!/bin/bash
a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
echo "a 等于 b"
fi

if [ $a != $b ]
then
echo "a 不等于 b"
fi

输出:

[root@liang shell]# ./shell01.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意: 乘号(*)前边必须加反斜杠()才能实现乘法运算;

三、关系运算符

  • -eq:检测两个数是否相等,相等返回 true。
  • -ne:检测两个数是否不相等,不相等返回 true。
  • -gt:检测左边的数是否大于右边的,如果是,则返回 true。
  • -lt:检测左边的数是否小于右边的,如果是,则返回 true。
  • -ge:检测左边的数是否大于等于右边的,如果是,则返回 true。
  • -le:检测左边的数是否小于等于右边的,如果是,则返回 true。


a=10
b=20

if [ $a -eq $b ]
then
echo "$a -eq $b : true"
else
echo "$a -eq $b: false"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b : true"
else
echo "$a -ne $b : false"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: true"
else
echo "$a -gt $b: false"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: true"
else
echo "$a -lt $b: false"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: true"
else
echo "$a -ge $b: false"
fi
if [ $a -le $b ]
then
echo "$a -le $b: true"
else
echo "$a -le $b: false"
fi

输出结果:

[root@liang shell]# ./shell01.sh
[root@liang shell]# ./shell01.sh
10 -eq 20: false
10 -ne 20: true
10 -gt 20: false
10 -lt 20: true
10 -ge 20: false
10 -le 20: true

四、布尔运算符

  • !:非运算,表达式为 true 则返回 false,否则返回 true。
  • -o:或运算,或运算,有一个表达式为 true 则返回 true。
  • -a:与运算,与运算,两个表达式都为 true 才返回 true。
a=10
b=20

if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi

if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : true"
else
echo "$a 小于 100 且 $b 大于 15 : false"
fi
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

输出内容:

[root@liang shell]# ./shell01.sh
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : true
10 小于 100 或 20 大于 100 : true
10 小于 5 或 20 大于 100 : false

五、逻辑运算符

&&:and
||:or
基本用法:与布尔运算符的 -a 和 -o类似

#!/bin/bash
a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "$a -lt 100 并且 $b -gt 100 : true"
else
echo "$a -lt 100 并且 $b -gt 100 : false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "$a -lt 100 或者 $b -gt 100 :true"
else
echo "$a -lt 100 或者 $b -gt 100 :false"
fi

输出:

[root@liang shell]# ./shell01.sh
10 -lt 100 并且 20 -gt 100 : false
10 -lt 100 或者 20 -gt 100 :true

特殊用法:[ 条件 ] && echo "true" || echo "false":条件成立打印true,否则打印false

#!/bin/bash
a=10
b=20

[ $a -gt $b ] && echo "a大于b" || echo 'a小于b'

[ $b -gt $a ] && echo "b大于a" || echo 'b小于a'

输出:

[root@liang shell]# ./shell01.sh
a小于b
b大于a

六、字符串运算符

  • =:检测两个字符串是否相等,相等返回 true。
  • !=:检测两个字符串是否相等,不相等返回 true。
  • -z:字符串长度是否为 0,为 0 则 true
  • -n:字符串长度是否不为 0,不为 0 返回 true
  • $:字符串是否为空,不为空返回 true
#!/bin/bash
a="abc"
b="def"

if [ $a = $b ]
then
echo "$a = $b : true"
else
echo "$a = $b: false"
fi
if [ $a != $b ]
then
echo "$a != $b : true"
else
echo "$a != $b: false"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi

输出内容:

[root@liang shell]# ./shell01.sh
abc = def: false
abc != def : true
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

七、文件表达式

  • -f:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
  • -d:检测文件是否是目录,如果是,则返回 true。
  • -x:检测文件是否可执行,如果是,则返回 true。
  • -r:检测文件是否可读,如果是,则返回 true。
  • -w:检测文件是否可写,如果是,则返回 true。
  • -e:检测文件(包括目录)是否存在,如果是,则返回 true。
  • -s:检测文件是否为空(文件大小是否大于0),不为空返回 true。
#!/bin/bash
file='text0003.sh'

if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在,新建"
touch $file
fi

if [ -s $file ]
then
echo '文件不为空'
else
echo '文件为空,写入内容'
echo "this is my fist add" >> $file
fi

[ -s $file ] && echo '文件不为空' || echo '文件为空'

if [ -r $file ]
then
echo '文件可读'
else
echo '文件不可读'
fi

if [ -w $file ]
then
echo '文件可写'
else
echo '文件不可写'
fi

if [ -x $file ]
then
echo '文件可执行'
else
echo '文件不可执行,增加可执行权限'
chmod +x $file
fi

[ -x $file ] && echo '文件可执行' || echo '文件不可执行'

输出:

[root@liang shell]# ./shell01.sh
文件不存在,新建
文件为空,写入内容
文件不为空
文件可读
文件可写
文件不可执行,增加可执行权限
文件可执行

小练习

编写如下shell程序

  • a.输入4个大于0小于等于20的数字,统计它们的和、最小的数字和最大的数字
  • b.要求有异常数字校验功能
#!/bin/bash

checkInt()
{
expr $1 "+" 10 &> /dev/null
[ $? -ne 0 ] && { echo "参数$1不是数字!";exit 1; }
}

if [ "$#" -ne 4 ];then
echo "参数个数有误"
exit 1
fi

max=$1
min=$1
for i in "$@"
do
checkInt $i
if [ $i -le 0 ];then
echo "输入的参$i数必须大于0"
exit 0
elif [ $i -gt 20 ];then
echo "输入的参数$i必须小于等于20"
exit 1
fi

if [ $max -lt $i ];then
max=$i
fi
if [ $min -gt $i ];then
min=$i
fi
let sum+=$i
done

echo "最大值为$max"
echo "最小值为$min"
echo "和为$sum"

执行

[root@liang shell]# ./test.sh  0 12 5 i
输入的参0数必须大于0
[root@liang shell]# ./test.sh 10 12 5 i
参数i不是数字!
[root@liang shell]# ./test.sh 10 12 5 20
最大值为20
最大值为5
和为47


标签:Shell,20,--,echo,运算符,gt,100,else,true
From: https://blog.51cto.com/u_15874356/5928339

相关文章