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]#