运算符

一、测试运算符
test 表达式
或者
[ 表达式 ]

(一)基本形式:

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


[root@Centos7 ~]# [ 1 -eq 1 ];echo $?
0
[root@Centos7 ~]# [ ! 1 -eq 1 ];echo $?
1
[root@Centos7 ~]# [ 1 -eq 1 -a 3 -gt 2 ];echo $?
0
[root@Centos7 ~]# [ 1 -eq 1 -a 3 -gt 5 ];echo $?
1
[root@Centos7 ~]# [ 1 -eq 1 -o 3 -gt 5 ];echo $?
0
[root@Centos7 ~]# [ 1 -gt 1 -o 3 -gt 5 ];echo $?
1
1.关于字符串的测试

1、-n STRING :字符长度为不为0结果才为真,字符串为空(什么都没有)结果为假

[root@Centos7 ~]# [ -n "abc" ];echo $?
0
[root@Centos7 ~]# [ -n "   " ];echo $?
0
[root@Centos7 ~]# [ -n "" ];echo $?
1

2、-z STRING:与-n相反

[root@Centos7 ~]# [ -z "abc" ];echo $?
1
[root@Centos7 ~]# [ -z "     " ];echo $?
1
[root@Centos7 ~]# [ -z "" ];echo $?
0

3、STRING1 = STRING2

[root@Centos7 ~]# [ "jkz" = "jkz" ];echo $?
0
[root@Centos7 ~]# [ "jkz" = "jkzxx" ];echo $?
1
[root@Centos7 ~]# [ "jkz" == "jkz" ];echo $?   #建议使用双等于号
0

4、STRING1 != STRING2

[root@Centos7 ~]# [ "jkz" != "jkzxx" ];echo $?
0
2.关于整形的比较
-eq:==
-ge:>=
-gt: >
-le: <=
-lt: <
-ne: !=

示例

[root@Centos7 ~]# [ 11 -ge 11 ];echo $?
0
[root@Centos7 ~]# [ 11 -ge 10 ];echo $?
0
[root@Centos7 ~]# [ 11 -gt 11 ];echo $?
1
[root@Centos7 ~]# [ 11 -gt 10 ];echo $?
0
[root@Centos7 ~]# [ 10 -lt 11 ];echo $?
0
[root@Centos7 ~]# [ 10 -le 10 ];echo $?
0
[root@Centos7 ~]# [ 10 -ne 10 ];echo $?
1
3.关于文件的比较
-d:文件必须存在,而且得是一个目录
[root@Centos7 ~]# [ -d /aaa/ ];echo $?
1
[root@Centos7 ~]# [ -d /etc ];echo $?
0


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


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


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


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


文件要存在必须需要有r、w、x权限
-r
-w
-x
[jkz@Centos7 ~]$ [ -r a.txt ];echo $?
1
[jkz@Centos7 ~]$ [ -w a.txt ];echo $?
1
[jkz@Centos7 ~]$ [ -x a.txt ];echo $?
1
[jkz@Centos7 ~]$ [ -r a.txt ];echo $?
0
二、运算符
1.整数、小数运算

expr $(()) $[] let   不支持小数运算

+、-、*、/           %:取余数

$[]

$[$n+1]
$[$n-1]
$[$n*1]
$[$n/1]
$[$n%1]

$(())

$(($n+1))
...

expr 运算符中间要有空格

expr $n + 1
expr 10 * 3

let

age=18
age=$[$age+1]
echo $age
19

let age=age+1   # 等于 age+=1
echo $age

let x=m++
let y=++n
echo $x
0

echo $y
1

1. 支持小数运算bc,python,awk


scale=2  # 代表的就是取多少位
echo $(echo "scale=2;33/100" | bc |cut -d. -f2)%
33%

2. 测试浮点型

[echo "10.3 >= 10.1" |bc -eq 1 ] # 结果为1才代表正确
2. 变量运算案例
[root@Centos7 ~]# ps aux
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
root          1  0.0  0.1 125712  2080 ?       Ss   Apr20   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?       S   Apr20   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?       S   Apr20   0:01 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?       S<   Apr20   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?       S   Apr20   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?       S   Apr20   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?       R   Apr20   0:01 [rcu_sched]
root         10  0.0  0.0      0     0 ?       S<   Apr20   0:00 [lru-add-drain]
root         11  0.0  0.0      0     0 ?       S   Apr20   0:00 [watchdog/0]
root         13  0.0  0.0      0     0 ?       S   Apr20   0:00 [kdevtmpfs]


第一种方法

[root@Centos7 ~]# ps aux | awk 'NR>1{print $5}' | tr '\n' '+' | sed -r 's#(.*)+#\1\n#g' |bc
4681212

[root@Centos7 ~]# ps aux | awk 'NR>1{print $5}' | xargs | tr ' ' '+' |bc
4672524

[root@Centos7 ~]# ps aux | awk 'NR>1{print $5}' | xargs | tr ' ' '+' |bc | awk '{print $1/1024/1024"MB"}'
4.56435MB


第二种方法:


[root@Centos7 ~]# ps aux| awk 'NR>1{he+=$5}END{print he}'
4353420

编写一个简单的计算器

要求:

执行脚本:

请输入第一个数字:20
请输入第二个数字:10
20 + 10 = 30
20 - 10 = 10
20 * 10 = 200
20 / 10 = 2

[root@Centos7 ~]# cat jsq.sh

!/bin/bash

提示用户输入第一个数字

read -p "请输入第一个你要运算的数字:" Num1

提示用户输入第二个数字

read -p "请输入第二个你要运算的数字:" Num2
echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(($Num1/$Num2))"
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:10
请输入第二个你要运算的数字:10
10 和 10 两个数字的加减乘除运算结果如下:
10 + 10 = 20
10 - 10 = 0
10 * 10 = 100
10 / 10 = 1

[root@Centos7 ~]# cat jsq.sh

!/bin/bash

提示用户输入第一个数字

read -p "请输入第一个你要运算的数字:" Num1

提示用户输入第二个数字

read -p "请输入第二个你要运算的数字:" Num2
echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(awk "BEGIN{print $Num1/$Num2}")"
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:10
请输入第二个你要运算的数字:20
10 和 20 两个数字的加减乘除运算结果如下:
10 + 20 = 30
10 - 20 = -10
10 * 20 = 200
10 / 20 = 0.5

加判断条件

[root@Centos7 ~]# cat jsq.sh

!/bin/bash

提示用户输入第一个数字

read -p "请输入第一个你要运算的数字:" Num1
expr  1 + $Num1 &>/dev/null
if [ $? -eq 0 ];then
   echo "你输入的第一个值满足运算条件"
else
   echo "你输入的第一个值不满足条件,请重新输入!"
   exit
fi

提示用户输入第二个数字

read -p "请输入第二个你要运算的数字:" Num2
expr  1 + $Num2 &>/dev/null
if [ $? -eq 0 ];then
   echo "你输入的第二个值满足运算条件"
else
   echo "你输入的第二个值不满足条件,请重新输入!"
   exit
fi

运算结果

echo "$Num1 和 $Num2 两个数字的加减乘除运算结果如下:"
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 / $Num2 = $(awk "BEGIN{print $Num1/$Num2}")"
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:a
你输入的第一个值不满足条件,请重新输入!
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:0.5
你输入的第一个值不满足条件,请重新输入!
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:1
你输入的第一个值满足运算条件
请输入第二个你要运算的数字:a
你输入的第二个值不满足条件,请重新输入!
[root@Centos7 /service/scripts/~]# sh jsq.sh
请输入第一个你要运算的数字:1
你输入的第一个值满足运算条件
请输入第二个你要运算的数字:1
你输入的第二个值满足运算条件
1 和 1 两个数字的加减乘除运算结果如下:
1 + 1 = 2
1 - 1 = 0
1 * 1 = 1
1 / 1 = 1

3. Shell的变量案例

  1. 使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl icanhazip.com


    [root@Centos7 ~]# cat var.sh

!/bin/bash

定义变量

System_Version=$(awk -F '[ .]' '{print $1,$4"."$5}' /etc/redhat-release)
Kernel_Version=$(uname -r | cut -c 1-10)
Virtualization=$(hostnamectl | awk '/Virtualization/{print $2}')
Static_Hostname=$(hostnamectl | awk '/Static/{print $3}')
Eth0=$(ifconfig eth0 | awk 'NR2{print $2}')
Lo=$(ifconfig lo | awk 'NR
2{print $2}')
Wan=$(curl -s ifconfig.me)

打印结果

echo "当前系统的版本为:$System_Version"
echo "当前系统的内核版本为:$Kernel_Version"
echo "当前系统虚拟化平台为:$Virtualization"
echo "当前系统静态主机名为:$Static_Hostname"
echo "系统的Eth0网卡IP地址为:$Eth0"
echo "系统的Lo网卡IP地址为:$Lo"
echo "当前系统的外网IP地址:$Wan"
[root@Centos7 /service/scripts/~]# sh var.sh
当前系统的版本为:CentOS 7.6
当前系统的内核版本为:3.10.0-957
当前系统虚拟化平台为:vmware
当前系统静态主机名为:shell
系统的Eth0网卡IP地址为:10.0.0.81
系统的Lo网卡IP地址为:127.0.0.1
当前系统的外网IP地址:183.192.140.109




02. 需求描述:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:

需求

1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
用户请输入数字1|2|3|4,可以执行对应项的功能。



[root@Centos7 ~]#
[root@Centos7 ~]# cat var-1.sh

!/bin/bash

String="Bigdata process is Hadoop, Hadoop is open source project"
echo $String

定义菜单

cat<<EOF
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
EOF

提示用户安装要求操作

read -p "请输入数字1|2|3|4,可以执行对应选项的功能:" Num

判断用户输入的是否为数字

expr 1 + $Num &>/dev/null
if [ $? -ne 0 ];then
   echo "你输入的不是一个数字!请重新输入!"
   exit
fi

根据用户的输入进行执行对应的命令

if [ $Num -eq 1 ];then
   echo "变量String的长度为:${#String}"
   exit
fi
if [ $Num -eq 2 ];then
   echo "删除字符串中所有的Hadoop,结果如下:"
   echo "${String//Hadoop/}"
   exit
fi
if [ $Num -eq 3 ];then
   echo "替换第一个Hadoop为Linux,结果如下:"
   echo "${String/Hadoop/Linux}"
   exit
fi
if [ $Num -eq 4 ];then
   echo "替换全部Hadoop为Linux"
   echo "${String//Hadoop/Linux}"
else
   echo "你输入的数字不符合要求!请输入数字1|2|3|4"
fi
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:a
你输入的不是一个数字!请重新输入!
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:5
你输入的数字不符合要求!请输入数字1|2|3|4
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:1
变量String的长度为:56
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:2
删除字符串中所有的Hadoop,结果如下:
Bigdata process is , is open source project
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:3
替换第一个Hadoop为Linux,结果如下:
Bigdata process is Linux, Hadoop is open source project
[root@Centos7 /service/scripts/~]# sh var-1.sh
Bigdata process is Hadoop, Hadoop is open source project
#############################
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
#############################
请输入数字1|2|3|4,可以执行对应选项的功能:4
替换全部Hadoop为Linux
Bigdata process is Linux, Linux is open source project

三、关系运算符
1.比较数字
[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 ~]#

示范

[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 ~]#
[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
2.赋值运算
[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 ~]#
[root@Centos7 ~]# ((y+=3))
[root@Centos7 ~]# echo $y
3
[root@Centos7 ~]# ((y*=10))
[root@Centos7 ~]# echo $y
30
3.总结

1、测试

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

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

2、加上$符号代表计算

$[]
$(())

3、

()
$()

4、[[]]与[]基本相同,唯一不同的是[[]]支持正则表达式匹配

[root@Centos7 ~]# [[ -d /etc ]];echo $?
0
[root@Centos7 ~]# [[ 1 -eq 1 ]];echo $?
0
[root@Centos7 ~]# [[ 1 -gt 10 ]];echo $?
1
[root@Centos7 ~]#

验证当前用户是否是管理员用户

[root@Centos7 ~]# [ $USER == "root" ];echo $?
0
[root@Centos7 ~]#

验证当前用户的用户名是否是j开头z结尾的

[jkz@Centos7 ~]$ [[ $USER =~ ^j.z$ ]];echo $?
0
[jkz@Centos7 ~]$ [[ $USER =~ "^j.
z$" ]];echo $? # 强调:正则表达式一定不要加引号
1

示例
[root@Centos7 day03]# cat num.sh

!/bin/bash

第一步:确定参数的个数必须是2个,不是两个就退出

条件 && cmd1 || cmd2

if 条件;then

cmd1

else

cmd2

fi


if [ $# -ne 2 ];then
  echo "传入的参数必须是2个"
  exit
fi

第二步:确定参数1必须是整型数字,不是就退出

if [[ ! $1 =~ [1]+$ ]];then
   echo "第一个参数必须是整型数字"
   exit
fi

第三步:确定参数2必须是整型数字,不是就退出

if [[ ! $2 =~ [2]+$ ]];then
   echo "第二个参数必须是整型数字"
   exit
fi

echo "验证全部通过"

第四步:比较两个整型数字,输出结果

[ $1 -gt $2 ] && echo "$1 大于 $2"
[ $1 -lt $2 ] && echo "$1 小于 $2"
[ $1 -eq $2 ] && echo "$1 等于 $2"


  1. 0-9 ↩︎

  2. 0-9 ↩︎

posted @ 2021-06-01 10:35  柯正  阅读(100)  评论(0编辑  收藏  举报