• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Shell脚本编程学习——Shell变量运算【显哥出品,必为精品】

Shell编程 lixian 4年前 (2020-04-22) 19885次浏览 1个评论 扫描二维码
文章目录[隐藏]

一、整数运算

1.expr

expr 有语法格式 两数和操作符之间必须要有空格,当第一个数为空值时,计算不会报错,当最后一个为空值时会报错
不能进行求方运算,乘的操作符需要转义

案例

[root@xian /server/scripts]# Num1=10
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# expr $Num1 + $Num2
14
[root@xian /server/scripts]# expr $Num1 - $Num2
6
[root@xian /server/scripts]# expr $Num1 * $Num2  #*需要转义
expr: syntax error
[root@xian /server/scripts]# expr $Num1 \* $Num2
40
[root@xian /server/scripts]# expr $Num1 / $Num2
2
[root@xian /server/scripts]# expr $Num1 % $Num2
2
[root@xian /server/scripts]# expr $Num1 ^ $Num2
expr: syntax error

2.$(())

没有严格的语法说明,不能求方 当第一个数为空值时,计算不会报错,当最后一个为空值时会报错

案例

[root@xian /server/scripts]# Num1=10
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# echo $(($Num1+$Num2))
14
[root@xian /server/scripts]# echo $(($Num1-$Num2))
6
[root@xian /server/scripts]# echo $(($Num1*$Num2))
40
[root@xian /server/scripts]# echo $(($Num1/$Num2))
2
[root@xian /server/scripts]# echo $(($Num1%$Num2))
2

3.$[]

没有严格的语法说明,不能求方 当第一个数为空值时,计算不会报错,当最后一个为空值时会报错

案例

[root@xian /server/scripts]# Num1=10
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# 
[root@xian /server/scripts]# echo $[$Num1+$Num2]
14
[root@xian /server/scripts]# echo $[$Num1-$Num2]
6
[root@xian /server/scripts]# echo $[$Num1*$Num2]
40
[root@xian /server/scripts]# echo $[$Num1/$Num2]
2
[root@xian /server/scripts]# echo $[$Num1%$Num2]
2

4.let案例

[root@xian /server/scripts]# Num1=10
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# let Num3=$Num1+$Num2
[root@xian /server/scripts]# echo $Num3
14
[root@xian /server/scripts]# a=1
[root@xian /server/scripts]# let a++
[root@xian /server/scripts]# let a++
[root@xian /server/scripts]# let a++
[root@xian /server/scripts]# echo $a
4
[root@xian /server/scripts]# let a--
[root@xian /server/scripts]# echo $a
3
[root@xian /server/scripts]# let a--
[root@xian /server/scripts]# echo $a
2

二、小数运算

1.bc命令

[root@xian /server/scripts]# Num1=10
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# echo $Num1+$Num2 |bc
14
[root@xian /server/scripts]# echo $Num1-$Num2 |bc
6
[root@xian /server/scripts]# echo $Num1*$Num2 |bc
40
[root@xian /server/scripts]# echo $Num1^$Num2 |bc
1000
[root@xian /server/scripts]# echo $Num1%$Num2 |bc
2
[root@xian /server/scripts]# echo $Num1/$Num2 |bc  
2
[root@xian /server/scripts]# Num2=3
[root@xian /server/scripts]# echo $Num1/$Num2 |bc  #bc不支持小数
3
[root@xian /server/scripts]# echo "scale=2;$Num1/$Num2" |bc  #需要加scale指定小数位
3.33
[root@xian /server/scripts]# echo "scale=9;$Num1/$Num2" |bc
3.333333333

2.awk简单计算

[root@xian /server/scripts]# awk 'BEGIN{print 10+3}'
13
[root@xian /server/scripts]# awk 'BEGIN{print 10-3}'
7
[root@xian /server/scripts]# awk 'BEGIN{print 10*3}'
30
[root@xian /server/scripts]# awk 'BEGIN{print 10%3}'
1
[root@xian /server/scripts]# awk 'BEGIN{print 10/3}'
3.33333
[root@xian /server/scripts]# Num1=9
[root@xian /server/scripts]# Num2=4
[root@xian /server/scripts]# awk 'BEGIN{print $Num1+$Num2}' #有$符合需要用双引号弱引用
0
[root@xian /server/scripts]# awk "BEGIN{print $Num1+$Num2}"
13
[root@xian /server/scripts]# awk -vNum1=14 -vNum2=6 'BEGIN{print Num1+Num2}'
20

3.python简单计算

[root@xian /server/scripts]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 14+3
17
>>> 10-4
6
>>> 13.0/3
4.333333333333333
>>> quit()
[root@xian /server/scripts]# Num1=11
[root@xian /server/scripts]# Num2=5
[root@xian /server/scripts]# echo "print $Num1+$Num2" |python
16
[root@xian /server/scripts]# echo "print $Num1-$Num2" |python
6
[root@xian /server/scripts]# echo "print $Num1*$Num2" |python
55
[root@xian /server/scripts]# echo "print $Num1/$Num2" |python
2
[root@xian /server/scripts]# echo "print ${Num1}.0/$Num2" |python
2.2

1.shell脚本代码

三、加减乘除计算脚本

[root@xian /server/scripts]# cat num.sh 
#!/bin/bash
####################################
# File Name: num.sh
# Time: 2020-04-22-11:22:01
# Author: lixian
# Organization: www.lixian.fun
####################################
#提示用户输入第一个数字
echo "整数加减乘除计算器:"
read -p "请输入第一个数字:" Num1
expr 1 + $Num1 &>/dev/null
if [ $? -eq 0 ];then
    echo -e "\033[42;37m您输入的数字符合规则\033[0m"
else
    echo -e "\033[41;37m您输入的数字不符合整数,请重新输入\033[0m"
    exit
fi
#提示用户输入第二个数字
read -p "请输入第二个数字:" Num2
expr 1 + $Num2 &>/dev/null
if [ $? -eq 0 ];then
    echo -e "\033[42;37m您输入的数字符合规则\033[0m"
else
    echo -e "\033[41;37m您输入的数字不符合整数,请重新输入\033[0m"
    exit
fi
#输出结果
echo "$Num1 + $Num2 = $(($Num1+$Num2))"
echo "$Num1 - $Num2 = $(($Num1-$Num2))"
echo "$Num1 * $Num2 = $(($Num1*$Num2))"
echo "$Num1 ÷ $Num2 =" $(awk "BEGIN{print $Num1/$Num2}")

2.执行结果

Shell脚本编程学习——Shell变量运算【显哥出品,必为精品】

四、打印系统信息

1.脚本代码

#!/bin/bash
##############################################################
# File Name: status.sh
# Time: 2020-04-22-12:39:39
# Author: lixian
# Organization: www.lixian.fun
##############################################################
System=$(cat /etc/redhat-release |awk -F ' ' '{print $1,$4}'| awk -F '.' '{print $1"."$2}')
Kernel=$(hostnamectl|grep Kernel|awk -F ' ' '{print $3}' |cut -c 1-10)
Vt=$(hostnamectl|grep Virtualization|awk '{print $2}')
Statichostname=$(hostnamectl|grep "Static hostname"|awk '{print $3}')
Eth0=$(ifconfig eth0|awk 'NR==2{print $2}')
Lo=$(ifconfig lo|awk 'NR==2{print $2}')
Network_w=$(curl -s ifconfig.me)

#输出系统信息

#当前系统版本
echo -e "\033[42;37m 当前系统版本是: $System \033[0m"
#当前系统内核
echo -e "\033[42;37m 当前系统内核是: $Kernel \033[0m"
#当前虚拟平台
echo -e "\033[42;37m 当前虚拟平台是: $Vt \033[0m"
#当前静态主机名
echo -e "\033[42;37m 当前静态主机名是: $Statichostname \033[0m"
#当前Eth0IP地址是
echo -e "\033[42;37m 当前Eth0IP地址是: $Eth0 \033[0m"
#当前lo地址
echo -e "\033[42;37m 当前lo地址是: $Lo \033[0m"
#当前外网地址
echo -e "\033[42;37m 当前外网地址是: $Network_w \033[0m"  

2.执行结果

[root@xian /server/scripts]# sh status.sh 
 当前系统版本是: CentOS 7.6 
 当前系统内核是: 3.10.0-957 
 当前虚拟平台是: vmware 
 当前静态主机名是: xian 
 当前Eth0IP地址是: 10.0.0.99 
 当前lo地址是: 127.0.0.1 
 当前外网地址是: 223.104.35.193

五、简单案例

1.业务需求

需求描述:变量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,可以执行对应项的功能。

2.脚本代码

#!/bin/bash
##############################################################
# File Name: string.sh
# Time: 2020-04-22-12:13:18
# Author: lixian
# Organization: www.lixian.fun
##############################################################
String="Bigdata process is Hadoop, Hadoop is open source project"
echo -e "\033[43;37m $String \033[0m"
#定义菜单
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 -e "\033[41;37m 您输入的字符不正确,请输入正整数! \033[0m"
    exit
fi
#执行操作
if [ $Num -eq 1 ];then
    echo -e "\033[42;37m String的长度为:${#String} \033[0m"
    exit
elif [ $Num -eq 2 ];then
    echo "删除字符串中所有的Hadoop"
    echo -e "\033[42;37m ${String//Hadoop/} \033[0m"
    exit
elif [ $Num -eq 3 ];then
    echo "替换第一个Hadoop为Linux"
    echo -e "\033[42;37m ${String/Hadoop/Linux} \033[0m"
    exit
elif [ $Num -eq 4 ];then
    echo "替换全部Hadoop为Linux"
    echo -e "\033[42;37m ${String//Hadoop/Linux} \033[0m"
    exit
else
    echo -e "\033[41;37m 您输入的数字不正确请输入1-4内的数字! \033[0m"
fi

3.执行结果

Shell脚本编程学习——Shell变量运算【显哥出品,必为精品】


本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Shell脚本编程学习——Shell变量运算【显哥出品,必为精品】
喜欢 (0)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.