shell编程二

4.3.4.2 特殊变量-状态变量

1. windows下书写的脚本,脚本文件复制到Linux执行异常的故障案例

'''
现象:windows下书写的脚本,上传到Linux执行报错.
原因:windows下面的回车换行\r\n ,linux下面回车换行\n
解决:替换结束标记即可.dos2unix windows-->linux
'''

[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh 
check_n_t.sh: line 3: $'\r': command not found
check_n_t.sh: line 4: $'\r': command not found

# 替换结束标记
[root@ubuntu2204 /server/scripts/shell-pro]# dos2unix check_n_t.sh 
dos2unix: converting file check_n_t.sh to Unix format...

[root@ubuntu2204 /server/scripts/shell-pro]# 
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh 
Usage: check_n_t.sh 用户名
[root@ubuntu2204 /server/scripts/shell-pro]# 
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh xk
xk 存在
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh xk5
xk5 不存在
[root@ubuntu2204 /server/scripts/shell-pro]# 

2. 通过脚本传参方式输入任何一个命令并执行,检查这个 命令的执行结果是否正确。

分析:
  输入命令(传参)
  判断脚本参数个数如果为0则报错与退出
  执行命令 $@
  检查结果 $?
    if判断如果是0,成功.输出成功
    if判断如果不是0,则失败.显示失败.
  最后给成功和失败提示加上颜色.

 

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_scripts.sh 
#!/bin/bash
##############################################################
# File Name:check_scripts.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

scripts="$@"

if [ $# -eq 0 ];then
    echo '请输入命令'
    exit
fi

${scripts} >/dev/null 2>&1

if [ $? -eq 0 ] ;then
    echo ${scripts}":执行成功"
else
    echo ${scripts}":执行失败"
fi
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh 
请输入命令
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh tree / -L 1   
tree / -L 1:执行成功
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#  
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh tre
tre:执行失败

4.3.4.3 特殊变量-变量子串

  • 变量子串 parameter expension变量扩展
  • 格式${变量},写为$变量形式无法识别
  • **作用:用于对变量处理,加工。(统计变量中字符串数量,对变量内容进行替换,删除。。。)
  • 应用:可以不用,如果使用效率高,格局打开.
# 变量子串(parameter表示变量名字)     含义

# 基础
${parameter} $para                   变量取值
${#parameter}                        # 统计字符长度(变量中有多少个字符)

# 删除(开头,结尾)                 word表示要删除的内容
${parameter#word}                    # 从变量左边开始删除,按照最短(第1个)匹配删除
${parameter##word}                   从变量左边开始删除,按照最长(贪婪)匹配删除
${parameter%word}                    从变量右边开始删除,按照最短匹配删除
${parameter%%word}                   从变量右边开始删除,按照最长匹配删除

# 截取(切片)类似于 cut -c
${var:5}
${var:5:2}                           # 从下标是5字符开始向后截取2个字符

# 替换 阉割版的sed
${para/word/replace}                 # 把word替换为replace 仅替换第1个
${para//word/replace}                把word替换为replace 替换全部
4.3.4.3.1 练习
# 1.统计字符串长度
[root@Kylin-V10-sp3 ~]# teacher=xiaoming
[root@Kylin-V10-sp3 ~]# echo ${#teacher}
8
[root@Kylin-V10-sp3 ~]# 

# 2. 删除变量中的内容(仅影响输出)
[root@Kylin-V10-sp3 ~]# teacher=xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo $teacher
xiaoming12345688
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# echo ${teacher#xiaoming}
12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#x}
iaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#i}
xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#*x}
iaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#*i}
aoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher##*i}
ng12345688
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# dir=/etc/sysconfig/network-scripts/ifcg-eth0
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# echo ${dir##*/}
ifcg-eth0
[root@Kylin-V10-sp3 ~]# echo ${dir%/*}
/etc/sysconfig/network-scripts
[root@Kylin-V10-sp3 ~]#

# 3. 截取(切片)
[root@Kylin-V10-sp3 ~]# echo ${teacher}
xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher:4}
ming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher:4:2}
mi
[root@Kylin-V10-sp3 ~]# echo ${teacher:4:}  # 无输出

[root@Kylin-V10-sp3 ~]# echo ${teacher:4:30}
ming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1-3
xia
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1
x
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1-20
xiaoming12345688
[root@Kylin-V10-sp3 ~]# 

# 4 替换
[root@Kylin-V10-sp3 ~]# echo ${teacher/i/o-}
xo-aoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher/i/o}
xoaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher//i/o}
xoaomong12345688
[root@Kylin-V10-sp3 ~]# 

面试题

查看代码
 '''
要求:bash for循环打印下面这句话中字母数大于6的单词(昆仑万维面试题)。
shell思路:
1. 脚本创建变量存放内容或脚本传参
2. 处理下数据,把数据里面的特殊符号替换为空格.
3. 循环+判断.
4. 满足条件则输出
length() awk函数用于统计某一列或整行的字符数量
${#var}
'''

# 1.使用${#变量}
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_str.sh 
#!/bin/bash
##############################################################
# File Name:check_str.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

#1. 脚本创建变量存放内容或脚本传参
str0="We are the successors of socialism."

#2. 处理下数据,把数据里面的特殊符号替换为空格.
str=${str0/./ }

# 3. 循环+判断.
for i in $str
do
    # 4. 满足条件则输出
    if [ ${#i} -ge 6 ];then
        echo $i "长度大于6,为:" ${#i}
    fi
done

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_str.sh 
successors 长度大于6,为: 10
socialism 长度大于6,为: 9

# 使用awk
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F"[ .]" 'length($1)>=6'
successors
socialism.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}'
We
are
the
successors
of
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}' | awk 'length($1)>=6'
successors
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}' | awk 'length($1)>=6 {print $1}'
successors
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

'''
在 awk 命令行中,-v RS= 选项用于设置输入记录分隔符(Record Separator, RS)为空字符串。这通常用于处理多行文本记录,
其中记录之间没有明显的分隔符(如换行符)。当 RS 被设置为空字符串时,awk 会将连续的空白行视为记录分隔符,或者更准确地说,
它会将任意长度的空白行序列视为单个记录分隔符。

在Linux中,xargs命令是一个非常强大的工具,用于从标准输入(stdin)构建并执行命令。xargs读取来自标准输入的数据,
然后将这些数据作为参数传递给指定的命令。-n1选项是xargs命令的一个重要选项,它告诉xargs每次只从输入中读取一个项目(即一个参数),
并将这个参数传递给指定的命令。
'''
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." | awk -vRS=" " 'length()>=6'
successors
socialism.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

 

4.3.4.3.2 变量子串-小结

  • 变量子串这部分整体熟悉: ${#变量} ${替换}
  • 掌握几个:计算变量字符串长度,替换。
  • 了解: 删除,截取.
  • man bash 搜索 Parameter Expansion

4.3.4.4 特殊变量-变量扩展(设置默认值)

给变量设置默认值

格式

含义

${parameter:- word}

变量parameter没定义或为空,把word作为默认值,不修改变量内容(输出)

${parameter:=word}

变量parameter没定义或为空,把word作为默认值,修改变量内容

${parameter:?word}

变量parameter没定义或为空,显示word,错误输出

${parameter:+word}

变量parameter没定义或为空,则啥也不做,否则把word替换变量内容

 

查看代码
 # :-
# 空值或者未创建该变量
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name  

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name:-xiaohong}
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# name=xiao
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name:-xiaohong}
xiao
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

# :=
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name1:=xiaohong}
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# name1=xiaohua
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1
xiaohua
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

# :+
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name3
xiaobai1
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name3:+xiaobai}
xiaobai
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name3
xiaobai1
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

4.3.4.5特殊变量小结

  • 为shell编程增光添彩.
  • 整体要认识。
  • man bash PARAMETERS
  • $$ 这个变量代表当前shell进程的PID(进程ID)。在编写shell脚本时,如果你需要引用当前脚本的进程ID,就可以使用$$

常用特殊变量

必会

了解

位置变量

$n $0 $# $@ $*

区别$@ $*

状态变量

$?

$$  $_ $!

变量子串

${#parameter}

${parameter/x/y}

除了前面的${para#xxx}

变量扩展(变量默认值)

${para:-word}

4.4 变量总结

变量命名,要求
变量基础操作,赋值,取值.
金庸新作 ${变量}
变量分类
  普通
  环境变量:
    PATH,LANG,PS1,UID
    export命令创建或修改环境变量
  特殊变量 $n $0 $# $* $@ $?

各种判断条件:

eq                 # 等于
ne                 # 不等于
lt less than <     # 小于
le less equal <=   # 小于等于
gt great than >    # 大于
ge great equal >=  # 大于等于

4.5 变量赋值

4.5.1 变量赋值语句

4.5.1.1 向变量中写入内容

赋值方法

格式

应用场景

直接赋值

name=xiaobai

大部分时候使用

命令结果赋值

hostname=`hostname`

获取命令的结果 `` 或$()

脚本传参(通过脚本命令行传参进行赋值)

user_name=$1 脚本的第1个参数

usernames=" $*"

一般用于命令行内容传入脚本中. 不想设置太多交互.

read交互式赋值

通过read命令实现

与用户有个交互过程

读取文件内容赋值给变量

未来循环中说

脚本读取文件的时候使用.

4.5.1.2 read

read通过交互式的方式进行赋值

 

-p

交互的时候提示信息。

-t (timeout)

超过这个时间没有操作,则自动退出.

-s

不显示用户的输入.记录密码才用

4.5.1.3 基本用法

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -p "请输入用户名: "  user
请输入用户名: root
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

4.5.1.4 不显示用户的输入

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -t5 -p "请输入用户名: " user
请输入用户名: [root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -t5 -s -p "请输入用密码: " pwd
请输入用密码: [root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

4.5.1.5 同时向2个变量赋值

# 类似 num1 num2: 2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -p "请输入两个数字,如:10 20:  " num1 num2
请输入两个数字,如:10 20:  2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $num1 $num2
2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

书写脚本检查输入的域名(1个或多个)是否可 ping(通过read方式实现)

# 使用read的时候用$#接收变量

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_url.sh 
#!/bin/bash
##############################################################
# File Name:check_url.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

read -p "请输入ip或者域名:" ip

if [ ${#ip} -eq 0 ];then
    echo "ip或域名不能为空!!!"
    exit
fi

ping -c1 -W 2 ${ip} >/dev/null 2>&1

if [ $? -eq 0 ];then
    echo ${ip} "可以ping通"
else
    echo ${ip} "ping不通"
fi	

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_url.sh
请输入ip或者域名:qq.com
qq.com 可以ping通
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

 

赋值方式

read

$1 $2 用$* 或$@接收(如:url="$@")

共同点

变量赋值

变量赋值

区别

与用户交互的地方(一问一答)

命令行传参,命令行脚本后面指定.

5. Shell编程必知必会的运算

  • 目标:通过shell脚本+awk和其他方式,实现在脚本中进行统计与计算.
  • 主要内容:
    • 运算符.
    • 运算的命令和符号.

5.1 运算符

shell-运算符

含义

+

加法符号

-

减法符号
* 乘法符号
/ 除法符号

%

取余,可以用于生成指定范围的随机数.

^或** 幂、指数

2^10=1024 10个2相乘.

i=i+1 i++

计数,计算次数

j=j+1 j+=1 (数字累加)   

j=j+$1 j+=$1 (变量累加)

求和,累加

&&

并且,前一个命令执行成功,再执行后面的命令(判断)

||

或者,前一个命令执行失败了,再执行后面的命令(判断)

 

查看代码
 #1. % 生成指定范围的随机数.
#随机的数字(n)对一个数字取余可以得到0到n-1范围的随机数。
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5 |bc
3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5 |bc
4
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5
31826%5

# 2. &&
# 检查目录是否存在
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# ls /etc/ >/dev/null 2>&1 && echo "目录存在"
目录存在

# 3. ||
# 没有则创建
root@Kylin-V10-sp3 /server/scripts/shell-pro]# tree -L 1 /root/
/root/
├── 1.py
├── 1.sh
├── anaconda-ks.cfg
├── app
├── app2
├── awkprof.out
├── conf_2024-09-11_3.tar.gz
├── hosts
├── http-dns.pcap
├── initial-setup-ks.cfg
└── test

3 directories, 8 files
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# ls /etc/abc/ >/dev/null 2>&1 || mkdir -p /root/abc/
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# tree -L 1 /root/
/root/
├── 1.py
├── 1.sh
├── abc
├── anaconda-ks.cfg
├── app
├── app2
├── awkprof.out
├── conf_2024-09-11_3.tar.gz
├── hosts
├── http-dns.pcap
├── initial-setup-ks.cfg
└── test

4 directories, 8 files
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

5.2 运算方法⭐⭐⭐⭐⭐

运算的命/符号

说明

应用场景

awk

可以进行计算,带小数,可以与shell脚本进行变量传递

一般计算都可以用awk

bc

带小数

一般计算都可以用bc. 需要安装

expr

进行计算,整数

一般用于检查输入内容是否为数字(方法之一).

let

进行计算,整数,变量直接使用即可 用于计算i++

$(())

进行计算,整数,变量直接使用即可

 

$[]

进行计算,整数,变量直接使用即可

 

5.2.1 awk进行计算

5.2.1.1 在awk中使用shell变量

[root@Kylin-V10-sp3 ~]# awk -vn1=10 -vn2=20 'BEGIN{print n1+n2}'
30
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# num1=10
[root@Kylin-V10-sp3 ~]# num2=20
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# awk -vn1=$num1 -vn2=$num2 'BEGIN{print n1+n2}'
30

awk -v选项用于创建或修改awk中的变量。-v是shell脚本与awk桥梁在awk中各种变量直接使用即可,不要加上$n1,如果加上了会被awk识别为取列.

5.2.2.bc

基本用法. -l显示小数.

# 基本用法. -l显示小数.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo 1+2 | bc -l
3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo 2^9 | bc -l
512
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

5.2.2.1 计算器

传入脚本中2个参数,进行计算,输出结果。

思路

1. 用户传入2个参数
2. 判断是否为数字,如果不是,显示提示信息然后脚本结束.增加个判断脚本参数个数是2.(这个判断与上面的重复,可以省略)
3. 进行计算,输出结果(awk,bc)

awk实现

脚本传参&&交互式传参
 # 1. 脚本传入参数

#!/bin/bash
##############################################################
# File Name:num_calc_param_awk.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

#vars
num1=$1
num2=$2

#判断为整数
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`  # 0 是整数
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n2 -eq 1 ];then  # -o 在[]里表示or
    echo "请输入整数"
    exit
fi


# 计算
add=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 + n4}'`
subtract=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 - n4}'`
mult=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 * n4}'`
if [ $num2 -eq 0 ]; then
    echo  $num2 "不能作为除数"
else
    divide=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 / n4}'`
fi

# 输出
cat <<EOF
$num1 + $num2 = $add 
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $divide
EOF
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_param_awk.sh 
请输入整数
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_param_awk.sh 10 20
10 + 20 = 30 
10 - 20 = -10
10 * 20 = 200
10 / 20 = 0.5
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 


# 2. 交互式传入参数
#!/bin/bash
##############################################################
# File Name:num_calc.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

# 输入
read -p "请输入需要计算的内容,如: 100 20    " num1 num2

# 检查是否为数字
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n1 -eq 1 ];then  # n1 n2 只要一个不是整数就退出
    echo "请输入整数"
    exit
fi

# 计算
add=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 + n4}'`
subtract=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 - n4}'`
mult=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 * n4}'`
if [ $n2 -eq 0 ];then
    divide=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 / n4}'`
else
    echo $num2 "不能作为除数"
fi

# 输出
cat <<EOF
$num1 + $num2 = $add
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $divide
EOF

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_read_awk.sh 
请输入需要计算的内容,如: 100 20    100 40
100 + 40 = 10
100 - 40 = 60
100 * 40 = 4000
100 / 40 = 2.5
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

bc实现

 

num_calc_read_bc.sh
 #!/bin/bash
##############################################################
# File Name:num_calc_read_bc.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

# 输入
read -p "请输入需要计算的内容,如: 100 20    " num1 num2

# 判端是否为整数
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n2 -eq 1 ];then
    echo "请按照格式输入整数"
fi

# 计算
add=`echo $num1 + $num2 | bc -l`
subtract=`echo $num1 - $num2 | bc -l`
mult=`echo $num1*$num2 | bc -l`

if [ $num2 -eq 0 ];then
    echo $num2 "不能为除数"
else
    devide=`echo $num1 / $num2 | bc -l`
fi

# 输出
cat << EOF
$num1 + $num2 = $add
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $devide
EOF

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_read_bc.sh 
请输入需要计算的内容,如: 100 20    200 10
200 + 10 = 210
200 - 10 = 190
200 * 10 = 2000
200 / 10 = 20.00000000000000000000
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

 

posted @ 2024-09-22 22:18  老虎死了还有狼  阅读(5)  评论(0编辑  收藏  举报