SHELL运算符

一、运算符

1、算数运算符

+	加
-	减
*	乘
/	除
%	取模

# 计算方式:
$[]  
$(())
expr
let



bc	支持浮点数计算

2、测试运算符

test 表达式
或者
[ 表达式 ]

# 说明:
· [[]]与[]基本相同,唯一不同的是[[]]支持正则表达式匹配
[root@Centos7 ~]# [[ -d /etc ]];echo $?
0
[root@Centos7 ~]# [[ 1 -eq 1 ]];echo $?
0
[root@Centos7 ~]# [[ 1 -gt 10 ]];echo $?
1

# 验证当前用户的用户名是否是e开头n结尾的(所谓的正则就是用到了^$等)
[egon@Centos7 ~]$ [[ $USER =~ ^e.*n$ ]];echo $?
0
[egon@Centos7 ~]$ [[ $USER =~ "^e.*n$" ]];echo $?  # 强调:正则表达式一定不要加引号
1

#(一)基本形式:
test EXPRESSION                 # 等同于 [ EXPRESSION ]
[ ! EXPRESSION ]                # 对测试的结果取反
[ EXPRESSION1 -a EXPRESSION2 ]  # 左右两个表达式必须都为真,测试结果才为真
[ EXPRESSION1 -o EXPRESSION2 ]  # 左右两个表达式但凡有一个为真,测试结果就为真


[root@www day03]# [ 1 -eq 1 ];echo $?
0
[root@www day03]# [ ! 1 -eq 1 ];echo $?
1
[root@www day03]# [ 1 -eq 1 -a 3 -gt 2 ];echo $?
0
[root@www day03]# [ 1 -eq 1 -a 3 -gt 5 ];echo $?
1
[root@www day03]# [ 1 -eq 1 -o 3 -gt 5 ];echo $?
0
[root@www day03]# [ 1 -gt 1 -o 3 -gt 5 ];echo $?
1


# (二)关于字符串的测试
# (1) -n STRING :字符长度为不为0结果才为真,字符串为空(什么都没有)结果为假
[root@www day03]# [ -n "abc" ];echo $?
0
[root@www day03]# [ -n "   " ];echo $?
0
[root@www day03]# [ -n "" ];echo $?
1

# (2) -z STRING:与-n相反(没有字符串才为真)
[root@www day03]# [ -z "abc" ];echo $?
1
[root@www day03]# [ -z "      " ];echo $?
1
[root@www day03]# [ -z "" ];echo $?
0

#(3)STRING1 = STRING2
[root@www day03]# [ "egon" = "egon" ];echo $?
0
[root@www day03]# [ "egon" = "egonxx" ];echo $?
1
[root@www day03]# [ "egon" == "egon" ];echo $?  # 建议使用
0

# (4)STRING1 != STRING2
[root@www day03]# [ "egon" != "egonxx" ];echo $?
0


# (三) 关于整型的比较
-eq:==
-ge:>=
-gt: >
-le: <=
-lt: <
-ne: !=
# 示例
[root@www day03]# [ 11 -eq 11 ]
[root@www day03]# [ 11 -ge 11 ];echo $?
0
[root@www day03]# [ 11 -ge 10 ];echo $?
0
[root@www day03]# [ 11 -gt 11 ];echo $?
1
[root@www day03]# [ 11 -gt 10 ];echo $?
0
[root@www day03]# [ 10 -lt 11 ];echo $?
0
[root@www day03]# [ 10 -le 10 ];echo $?
0
[root@www day03]# [ 10 -ne 10 ];echo $?
1



# (四)关于文件的比较
-d:文件必须存在,而且得是一个目录
[root@www day03]# [ -d /aaa/ ];echo $?
1
[root@www day03]# [ -d /etc ];echo $?
0


-e : 只要文件存在即可,不区分文件类型
[root@www day03]# [ -e /etc/passwd ];echo $?
0
[root@www day03]# [ -e /etc ];echo $?
0


-f:文件必须存在,而且得是一个普通的文档文件
[root@www day03]# [ -f /etc/passwd ];echo $?
0
[root@www day03]# [ -f /etc ];echo $?
1

-L FILE:文件必须存在,而且得是一个软连接文件
[root@www day03]# ln -s /etc/passwd a.txt
[root@www day03]# ll a.txt 
lrwxrwxrwx 1 root root 11 Aug 26 15:36 a.txt -> /etc/passwd
[root@www day03]# [ -L a.txt ];echo $?
0


# 文件要存在必须需要有r、w、x权限
-r
-w
-x
[egon@Centos7 day03]$ [ -r a.txt ];echo $?
1
[egon@Centos7 day03]$ [ -w a.txt ];echo $?
1
[egon@Centos7 day03]$ [ -x a.txt ];echo $?
1
[egon@Centos7 day03]$ [ -r a.txt ];echo $?
0


# -s:当文件内容不为空时结果为真
[root@Centos7 day03]# ll a.txt 
-------r-- 1 root root 0 Aug 26 23:42 a.txt
[root@Centos7 day03]# [ -s a.txt ];echo $?
1
[root@Centos7 day03]# echo "hello" >> a.txt
[root@Centos7 day03]# [ -s a.txt ];echo $?
0

3、关系运算符

[ 表达式1 -a 表达式2 ]
(( 表达式1 )) && (( 表达式2 )) 

[ 表达式1 -o 表达式2 ]
(( 表达式1 )) || (( 表达式2 )) 

[root@Centos7 ~]# (( 10 == 10 ));echo $?
0
[root@Centos7 ~]# (( 10 >= 10 ));echo $?
0
[root@Centos7 ~]# (( 10 > 10 ));echo $?
1
[root@Centos7 ~]# (( 10 < 11 ));echo $?
0
[root@Centos7 ~]# (( 10 <= 10 ));echo $?
0
[root@Centos7 ~]# (( 10 != 10 ));echo $?
1

# 了解:比较小数
[root@Centos7 ~]# echo "10.3 > 10.1" | bc
1
[root@Centos7 ~]# echo "10.3 > 10.5" | bc
0
[root@Centos7 ~]# echo "10.3 == 10.5" | bc
0
[root@Centos7 ~]# echo "10.3 != 10.5" | bc
1

# 示范(可以实现浮点数之间的数值比较)
[root@Centos7 ~]# cat test.sh 
#!/bin/bash

read -p "float num1>>>: " num1
read -p "float num2>>>: " num2

if [ `echo "$num1 > $num2" | bc` -eq 1 ]
then
    echo "$num1 大于 $num2"
else
    echo "$num1 不大于 $num2"
fi

[root@Centos7 ~]# chmod +x test.sh 
[root@Centos7 ~]# ./test.sh 
float num1>>>: 1.3
float num2>>>: 1.5
1.3 不大于 1.5
[root@Centos7 ~]# ./test.sh 
float num1>>>: 1.7
float num2>>>: 1.3
1.7 大于 1.3

4、赋值运算符

# 注意:使用let可以在对变量重新赋值,简化代码量
[root@Centos7 ~]# unset x
[root@Centos7 ~]# let x+=1
[root@Centos7 ~]# echo $x
1
[root@Centos7 ~]# let x+=1
[root@Centos7 ~]# echo $x
2
[root@Centos7 ~]# ((y+=3))
[root@Centos7 ~]# echo $y
3
[root@Centos7 ~]# ((y*=10))
[root@Centos7 ~]# echo $y
30

5、示例

① 数值比较

read -p "请输入你想要比较的第一个值(可输入整数或浮点数) >>> " num1
read -p "请输入你想要比较的第二个值(可输入整数或浮点数)>>> " num2

# 判断第一个值是整数还是浮点数
if [[ $num1 =~ ^[0-9]+$ ]];then
   echo "第一个数为整数"
elif [[ $num1 =~ ^[0-9]+.[0-9]+$ ]];then
   echo "第一个数为浮点数"
else
   echo "请输入一个整数或浮点数"
   exit
fi

# 判断第二个值是整数还是浮点数
if [[ $num2 =~ ^[0-9]+$ ]];then
   echo "第二个数为整数"
elif [[ $num2 =~ ^[0-9]+.[0-9]+$ ]];then
   echo "第二个数为浮点数"
else
   echo "请输入一个整数或浮点数"
   exit
fi

# 因为浮点数需要做判断无法用eq方式,所以使用bc,这里情况比较特殊,如果是为真那么返回值为1.
if [ `echo "$num1 > $num2" | bc` -eq 1 ];then
   echo "$num1 大于 $num2"
elif [ `echo "$num1 < $num2" | bc` -eq 1 ];then
   echo "$num1 小于 $num2"
elif [ `echo "$num1 = $num2" | bc` -eq 1 ];then
   echo  "$num1 等于 $num2"
else
    echo "重新输入"
fi

② 登录脚本

#!/bin/bash
while true;do
username="tcy"
password="123.com"
read -p "请输入你的账号: " use
read -p "请输入你的密码: " pass
# 必须要用户名和密码都温和才能通过,否则直接退出,exit为直接退出脚本,continue为退出重新执行
    if [ $use == $username -a $pass == $password ];then
        echo "验证通过..."
        exit
    else
        echo "验证失败,请重新登录"
        continue
    fi
done

③ 判断是否为整数

# 判断是否为整数,可以用expr运算方式,如果不是整数相加则会直接报错
#!/bin/bash
read -p "请输入需要判断是否为整数的值 >>> " a
expr $a + 1 &>/dev/null
if [ $? -eq 0 ];then
  echo "$a 为整数"
else
  echo "$a 不为整数"
fi

④ 计算器

#!/bin/bash
read -p "请输入第一个整数 >>> " num1
read -p "请输入第二个整数 >>> " num2

# 判断两位数是否为整数,用到了正则匹配,所以使用[[]]支持正则匹配
[[ ! $num1 =~ ^[0-9][0-9]$ ]] && echo "第一位数非两位数整数" && exit
[[ ! $num2 =~ ^[0-9][0-9]$ ]] && echo "第二位数非两位数整数" && exit

echo "$num1+$num2=$(($num1+$num2))"
echo "$num1-$num2=$(($num1-$num2))"
echo "$num1*$num2=$(($num1*$num2))"
echo "$num1/$num2=$(($num1/$num2))"

posted @ 2020-08-27 19:31  元气少女郭德纲!!  阅读(126)  评论(0编辑  收藏  举报