首页 > 系统相关 >shell编程二

shell编程二

时间:2024-09-22 22:12:09浏览次数:9  
标签:shell Kylin V10 sp3 scripts root 编程

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

常用特殊变量

必会

了解

位置变量

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

 

标签:shell,Kylin,V10,sp3,scripts,root,编程
From: https://www.cnblogs.com/daofaziran/p/18425128

相关文章

  • GUI编程Day01
    GUI编程组件窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘事件外挂破解工具简介GUI的核心技术:SwingAWT因为界面不美观运行需要jre环境MVC的基础,了解MVC架构,了解监听可以写出自己心中想要的一些小工具工作时候,也可能需要维护到Swing界面,概......
  • 2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解
    本文参考https://www.cnblogs.com/Kescholar/p/18306136这一题可能对高手来说就能轻而易举的看出是个01背包,但是对于我这种小白还是要经过详细的分析才可以理解。我们题目要求的是获得的最大报酬,题目的影响因素有三个:工作时长、工作截止时间、对应的报酬,那么怎么样合理的去......
  • C++ 元编程
    目录C++元编程1.术语2.元函数1.数值元函数示例:阶乘计算2.类型元函数示例:类型选择3.混合编程1.常规的计算点积范例2.混合元编程计算点积4.typelist实现设计和基本操作接口(算法)完整代码5.tuple实现基础知识1.左值、右值、左值引用、右值引用2.std::move......
  • 【Shell】变量修改
    【Shell】变量修改变量修改变量的修改有以下几种方式:变量设置方式说明${变量名#匹配字串}从头向后开始匹配,删除符合匹配字串的最短数据${变量名##匹配字串}从头向后开始匹配,删除符合匹配字串的最长数据${变量名%匹配字串}从尾向前开始匹配,删除符合匹配字串的......
  • 【网络安全】学过编程就是黑客?
      前言黑客,相信经常接触电脑的朋友们对这个词都不陌生,各类影视视频中黑客总是身处暗处,运筹帷幄,正是这种神秘感让我走向学习编程的道路,也正是如此让我明白黑客远没有我想象中那么“帅气”。黑客......
  • 【网络安全】学过编程就是黑客?
      前言黑客,相信经常接触电脑的朋友们对这个词都不陌生,各类影视视频中黑客总是身处暗处,运筹帷幄,正是这种神秘感让我走向学习编程的道路,也正是如此让我明白黑客远没有我想象中那么“帅气”。黑客......
  • 初始网络编程(下)
    所属专栏:Java学习     1.TCP的简单示例同时,由于TCP是面向字节流的传输,所以说传输的基本单位是字节,接受发送都是使用的字节流方法签名方法说明Socketaccept()开始监听指定端口(创建时绑定的端口),有客户端连接时,返回一个服务端Socket对象,并基于Socket......
  • 推荐一个很酷的脚本工具,几行代码,就能编写有用的 shell 脚本,月猛增 7.4 K Star太牛逼了
     今天给大家介绍的是gum,它是一个很酷的脚本工具。项目介绍gum是一个很棒的脚本工具,提供了高度可配置,随时可用的实用程序,只需几行代码,就能编写有用的shell脚本。让我们构建一个简单的脚本来创建提交。由下面的代码开始:#!/bin/sh询问gumchoose的提交类型:gum ch......
  • shell中$后加引号有什么用($"string"和$'string')
    (1).如果没有特殊定制bash环境或有特殊需求,$"string"和"string"是完全等价的,使用$""只是为了保证本地化。以下是manbash关于$""的解释:Adouble-quotedstringprecededbyadollarsign($"string")willcausethestringtobetranslatedaccordi......
  • 【编程底层原理】彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的(一级缓存为
    一、整体推导思路为了彻底搞懂Spring是如何利用三级缓存来解决循环依赖问题的,要么去找三级缓存的设计者了解其设计的初衷,要么利用反推法来进行倒推(即一级缓存为啥不行,二级缓存为啥也不合适)。为了让大家能有一个更清晰的理解脉路,下面将先从反推法来介绍下一级缓存为啥不......