shell编程三
5.2.3 expr
使用注意事项:
1. 使用空格,
2. 对*号转义.
# expr 进行计算的时候结果为0 ,返回值就是1.可以判断返回值大于1即可.或者等于2也行.
[root@Kylin-V10-sp3 ~]# expr 1+1
1+1
[root@Kylin-V10-sp3 ~]# expr 1 + 1
2
[root@Kylin-V10-sp3 ~]# expr 1 / 1
1
[root@Kylin-V10-sp3 ~]# expr 10 / 2
5
[root@Kylin-V10-sp3 ~]# expr 10 * 2
expr: 语法错误:未预期的参数 “1.py”
[root@Kylin-V10-sp3 ~]# expr 10 \* 2
20
[root@Kylin-V10-sp3 ~]# expr 10 - 2
8
[root@Kylin-V10-sp3 ~]# expr 1 - 1
0
[root@Kylin-V10-sp3 ~]# echo $?
1
[root@Kylin-V10-sp3 ~]#
5.2.3.1 数字判断
# 思路:
1.输入字符串给变量num(read)
2.检查num 是否为数字 expr
3.检查expr命令返回值即可
read -p "请输入两个数字:" num1 num2
expr $num1 + $num2 >/dev/null 2>&1
# expr结果大于等于2为异常
if [ $? -ge 2 ];then
echo "$0 $num1 $num2"
else
echo "输入正确"
fi
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_num.sh
请输入两个数字:
check_num.sh
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_num.sh 10a 20
请输入两个数字:10a 20
check_num.sh 10a 20
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_num.sh
请输入两个数字:30 10
输入正确
5.2.4 let,$(()), $[]
不支持小数,一般进行简单计算.
let,$(()),$[]
# let
[root@Kylin-V10-sp3 ~]# a=10
[root@Kylin-V10-sp3 ~]# b=20
[root@Kylin-V10-sp3 ~]# let c=$a + $b
-bash: let: +:语法错误: 需要操作数 (错误符号是 "+")
[root@Kylin-V10-sp3 ~]# let c=$a+$b
[root@Kylin-V10-sp3 ~]#
[root@Kylin-V10-sp3 ~]# echo $c
30
[root@Kylin-V10-sp3 ~]# let d=a+b
[root@Kylin-V10-sp3 ~]# echo $d
30
[root@Kylin-V10-sp3 ~]# let c++
[root@Kylin-V10-sp3 ~]#
[root@Kylin-V10-sp3 ~]# echo $c
31
[root@Kylin-V10-sp3 ~]#
# $(())
[root@Kylin-V10-sp3 ~]# e=$((a+b))
[root@Kylin-V10-sp3 ~]# echo $e
30
[root@Kylin-V10-sp3 ~]#
# 生成随机数(0-99)
[root@Kylin-V10-sp3 ~]# echo $((RANDOM%100))
51
[root@Kylin-V10-sp3 ~]# echo $((RANDOM%100))
14
[root@Kylin-V10-sp3 ~]# echo $((RANDOM%100))
86
[root@Kylin-V10-sp3 ~]#
#$[]
[root@Kylin-V10-sp3 ~]# f=$[a+b]
[root@Kylin-V10-sp3 ~]# echo $f
30
[root@Kylin-V10-sp3 ~]#
5.3 小结
掌握常用的运算符. && ||
掌握运算命令,符号: awk,bc,expr,let,$(()),$[]
运算的命令/符号 |
说明 |
应用场景 |
awk |
可以进行计算,带小数,可以与shell脚本进行变量传递 |
一般计算都可以用awk. |
bc |
带小数 |
一般计算都可以用bc.需要安装. |
expr |
进行计算,整数 |
一般用于检查输入内容是否为数字(方法之一). |
let |
进行计算,整数,变量直接使用即可 |
用于计算i++ |
$[[]] |
进行计算,整数,变量直接使用即可 |
|
$(()) |
进行计算,整数,变量直接使用即可 |
6. 逻辑-判断
- 条件表达式-裸奔版本的判断(最基本)
- if判断-更加灵活判断
- case语句-适用于做菜单选择(格式)
6.1 条件表达式
- 条件表达式属于判断中的核心,if后面都在使用它,也可以和&&,||一起使用.
- 目标:
- 熟练掌握条件表达式的格式.
- 熟练使用条件表达式进行判断(文件,大小,字符串,与或非)
6.1.1 格式
条件表达式也可以叫条件测试语句
面试题-[] [[]]区别
含义与特点 |
test 或 [ ] |
[[ ]] 或 (( )) (小括号) |
共同点 |
都可以用于判断 |
都可以用于判断 |
区别1 |
仅支持普通判断,不支持正则 |
[[ ]] 普通判断,支持正则 |
区别2 |
表示逻辑关系(与或非)符号不同 -a -o ! -gt |
[[ ]] && || ! > < <= >= |
应用场景 |
大部分情况下使用 [] 进行常见判断 |
[[ ]] 使用正则的时候使用2对中括号, (())可以用于运算. |
6.1.2 判断文件
条件表达式符号
条件表达式-文件 |
说明 |
-f |
file 判断是否存在;判断这个是否为文件,如果是则为真(成立) |
-d |
dir 判断是否存在;判断这个是否为目录,如果是则为真(成立) |
-x |
executable 判断是否存在;是否有执行权限 |
-s |
size 判断是否存在;文件大小是否大于0 (是否为空) 非空为真 |
-r |
是否有读权限 |
-w |
是否有写权限 |
-nt |
newer than 两个文件修改时间 是否更加新 |
-ot |
older than 两个文件修改时间 是否更加老 |
-L/-h |
软连接,符号连接 link |
-e |
是否存在(任何类型文件) |
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -d /etc/aaa/ && echo OK || echo failed
failed
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -d /etc/ && echo OK || echo failed
OK
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -f /etc/hosts && echo OK || echo failed
OK
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -f /etc/hosts123 && echo OK || echo failed
failed
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -e /etc/hosts123 && echo OK || echo failed
failed
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -e /etc/ && echo OK || echo failed
OK
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -x /etc/hosts && echo OK || echo failed
failed
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -e /etc/rc.local && echo OK || echo failed
OK
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -x /etc/rc.local && echo OK || echo failed
failed
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# chmod +x /etc/rc.local
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# test -x /etc/rc.local && echo OK || echo failed
OK
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
通过脚本传参方式传输1个参数,判断是否为文件, 是否为目录,是否具有执行权限.
x1=$1
test ${#x1} -eq 0 && echo "请输入参数" && exit 1
test -d $x1 && echo "这是目录" && exit 0
test -L $x1 && echo "这是软连接" && exit 0
test -f $x1 && echo "这是文件" && test -x $x1 && echo "文件有执行权限" || echo "文件没有执行权限"
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_file_dir_x.sh /etc
这是目录
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_file_dir_x.sh /etc/hosts
这是文件
文件没有执行权限
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_file_dir_x.sh /etc/rc.local
这是软连接
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.1.3 对比字符串
用于对比或比较2个字符串内容。
字符串对比的时候加上引号
条件表达式-字符串对比 |
说明 |
"str1" = "str2" |
str1 是否等于str2,如果相等则为真 |
"str1" != "str2" |
str1 是否等于str2,如果不相等则为真 |
-z "str" |
zero 贼肉 检查str字符串是否为空,空的则为真 |
-n "str" |
not zero 检查str字符串是否为空,非空的则为真。 |
6.1.3.1 字符串是否相等
[root@Kylin-V10-sp3 ~]# input=start
[root@Kylin-V10-sp3 ~]#
[root@Kylin-V10-sp3 ~]# [ "$input" = "startx" ] && echo ok || echo wrong
wrong
[root@Kylin-V10-sp3 ~]# [ "$input" = "start" ] && echo ok || echo wrong
ok
# 企业级小技巧:在进行字符串比较的时候变量尾巴可以加上个x,防止变量为空,造成匹配/执行失败.
[root@Kylin-V10-sp3 ~]# [ "$input"x = "start"x ] && echo ok || echo wrong
ok
[root@Kylin-V10-sp3 ~]#
6.1.3.2 检查字符串是否为空
[root@Kylin-V10-sp3 ~]# echo $h # 没有变量h
[root@Kylin-V10-sp3 ~]# [ -z "$input" ] && echo ok || echo wrong
wrong
[root@Kylin-V10-sp3 ~]# [ -n "$input" ] && echo ok || echo wrong
ok
[root@Kylin-V10-sp3 ~]# [ -z "$h" ] && echo ok || echo wrong
ok
[root@Kylin-V10-sp3 ~]# [ -n "$h" ] && echo ok || echo wrong
wrong
[root@Kylin-V10-sp3 ~]#
6.1.3.3 检查指定的服务状态脚本,是否运行,是否开机自启动
service=$1
# 判断参数
test ${#service} -eq 0 && echo "请输入参数" && exit 1
# 判断服务是否存在
ser_count=`systemctl list-unit-files | grep ${service}.service | wc -l`
if [ $ser_count = 0 ];then
echo "服务不存在"
exit 1
fi
# 判断状态
active_status=`systemctl is-active ${service}`
test "$active_status" = "active" && echo $service "服务启动" || echo $service "未启动"
enabled_status=`systemctl is-enabled ${service}`
test "$enabled_status" = "enabled" && echo $service "服务开机自启" || echo $service "未做开机自启"
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# vim check_server.sh
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_server.sh sshd
sshd 服务启动
sshd 服务开机自启
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_server.sh
请输入参数
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_server.sh nginx
nginx 未启动
nginx 未做开机自启
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.1.3.4 使用read指令的脚本增加判断功能,如果变量为空则退出
使用read的时候 $#无法使用.
-z +read变量
#!/bin/bash
##############################################################
# File Name:check_read_null.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
read -p "请输入数字:" num
[ -z $num ] && {
echo "请重新输入数字"
exit 1
}
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_read_null.sh
请输入数字:123
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_read_null.sh
请输入数字:
请重新输入数字
6.1.4 比大小(整数)
温馨提示:记忆关键单词
- -eq equal 等于.
- -gt great than 大于
- -lt less than 小于
条件表达式-整数相关 |
[] |
[[ ]] |
大于 |
-gt great than |
> |
大于等于 |
-ge great equal |
>= |
小于 |
-lt less than |
< |
小于等于 |
-le less equal |
<= |
等于 |
-eq equal |
== |
不等于 |
-ne not equal | != |
⚠ 不支持小数的对比,仅支持整数. |
6.1.4.1 比较大小 []
[root@Kylin-V10-sp3 ~]# [ 666 -gt 1 ] && echo "成立 " || echo "失败"
成立
[root@Kylin-V10-sp3 ~]# [ 0 -gt -1 ] && echo "成立 " || echo "失败"
成立
[root@Kylin-V10-sp3 ~]# [ 0 -gt -1000 ] && echo "成立 " || echo "失败"
成立
[root@Kylin-V10-sp3 ~]# [ 0 -gt 0.5 ] && echo "成立 " || echo "失败"
-bash: [: 0.5:需要整数表达式
失败
[root@Kylin-V10-sp3 ~]#
6.1.4.1 比较大小 [[]]
[root@Kylin-V10-sp3 ~]# [[ 60 > 6 ]] && echo "成立 " || echo "失败"
成立
[root@Kylin-V10-sp3 ~]# [[ 6 >= 6 ]] && echo "成立 " || echo "失败"
-bash: 条件表达式中有语法错误
-bash: “6”附近有语法错误
[root@Kylin-V10-sp3 ~]#
#这里面也可以用-gt -lt ........(不推荐使用,对比的时候会有语法问题。)
6.1.5 逻辑盘判断
- 多个条件表示同时成立,表示或者,表示取反.
- 与或非.
条件表达式-逻辑判断 |
[]中的写法 | [[ ]]中的写法 |
与(同时成立) |
条件1 -a 条件2 (and) | && |
或(只有有个成立的就行) |
条件1 -o 条件2 (or) | || |
非(取反) |
! | ! |
防火墙没有运行 并且 没有开机自启动 输出防火墙关闭
active_status=`systemctl is-active firewalld`
enabled_status=`systemctl is-enabled firewalld`
if [ "$active_status" != "active" -a "$enabled_status" != "enabled" ];then
echo "防火墙已经完全关闭"
else
echo "防火墙没有完全关闭"
fi
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_firewalld.sh
防火墙没有完全关闭
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# systemctl is-active firewalld
active
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# systemctl is-enabled firewalld
enabled
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.1.6 正则怕判断
=~ is match(支持正则)
6.1.6.1 使用正则精确匹配数字
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# num=666
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# [[ $num =~ ^[0-9]+$ ]] && echo 成功 || echo 失败
成功
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# [[ xk666 =~ ^[0-9]+$ ]] && echo 成功 || echo 失败
失败
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# num2=99.99
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# [[ $num2 =~ ^[0-9]+(\.[0-9]+)?$ ]] && echo 成功 || echo 失败
成功
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.1.6.2 判断输入是整数,浮点数(小数),还是字符
书写一个脚本通过read读取输入,判断输 入是整数,浮点数(小数),还是字符
#!/bin/bash
##############################################################
# File Name:check_type.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
read -p "请输入一些内容" param
[ -z $param ] && {
echo "请输入参数"
exit 1
}
[[ "$param" =~ ^[0-9]+$ ]] && {
echo 类型为整数
exit
}
[[ "$param" =~ ^[0-9]+(\.[0-9]+)?$ ]] && echo 类型为小数
[[ "$param" =~ ^[0-9a-zA-Z]+$ ]] && echo 类型为字符串
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_type.sh
请输入一些内容123
类型为整数
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_type.sh
请输入一些内容123.456
类型为小数
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_type.sh
请输入一些内容shdg34hf
类型为字符串
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.1.6.3 面试题-[] [[]]区别
含义与特点 |
test 或 [ ] | [[ ]] 或 (( )) (小括号) |
共同点 |
都可以用于判断 | 都可以用于判断 |
区别1 |
仅支持普通判断,不支持正则 |
[[ ]] 普通判断,支持正则 |
区别2 与或非 |
表示逻辑关系(与或非)符号不同 -a -o ! |
[[ ]] && || ! |
区别3 比较大小 |
-eq -ne -gt -ge -lt -le | > >= < <= |
应用场景 |
大部分情况下使用 [] 进行常见判断 |
[[ ]] 使用正则的时候使用2对中括号,(())可以用于运算. |
6.1.7 小结
条件表达式分类 |
必会 |
熟悉 |
文件 |
-f -d -x -s | -r -w -nt -ot -L ..... |
字符串比较 |
= != === | -n -z |
比较大小 |
-eq -ne -gt -ge -lt -le | .... |
逻辑 |
-a ! -o | |
正则 |
[[ $num =~ ^[0-9]+ $ ]] |
查询帮助: man test 或 man bash 搜索CONDITIONAL EXPRESSIONS
6.2 if
- 应用:if一般与条件表达式一起使用,也可以直接加上命令.
- 目标:
- if判断适用于更加复杂的判断与检查
- if判断语句的格式
- 分类:根据满足/不满足条件后,做什么,可以分类单分支,双分支,多分支.
6.2.1 单分支判断
第1种-单分支
引用场景:与&&或||类似,用于放在脚本开头进行判断,脚本参数数量,输入内容是否符合规则。
单分支判断
if 条件;then
满足条件后执行的内容。
fi
if 条件
then
满足条件后执行的内容。
fi
[ $# -eq 2 ] || {
echo "必须要2个数字"
exit 1
}
if [ $# -ne 2 ];then
echo "脚本必须要2个参数"
exit 1
fi
6.2.2 双分支判断
if 条件;then
满足条件后执行的内容。
else
不满足条件执行的内容。
fi
if 丁同学条件;then
迎娶白富美,富婆.
else
是个女的就行.
fi
6.2.3 多分支判断
if 条件;then
else
fi
#第1次判断
if 条件;then
满足条件后执行的内容。
#第2次判断
elif 条件;then #else if
满足elif条件,执行的内容。
#第3次判断 还可以继续增加.
elif 条件;then
满足elif条件,执行的内容。
else
不满足条件执行的内容。
fi
6.2.3.1 书写多分支格式比较大小脚本
compare_num.sh
#!/bin/bash
##############################################################
# File Name:compare_num.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
read -p "请输入两个数:" num1 num2
[[ ! $num1 =~ ^-?[0-9]+$ ]] && {
echo "请输入整数" $num1
exit 1
}
[[ ! $num2 =~ ^-?[0-9]+$ ]] && {
echo "请输入整数" $num2
exit 1
}
if [ $num1 -gt $num2 ];then
echo "$num1 > $num2"
elif [ $num1 -eq $num2 ];then
echo "$num1 = $num2"
else
echo "$num1 < $num2"
fi
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash compare_num.sh
请输入两个数:123 321
123 < 321
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash compare_num.sh
请输入两个数:-1 -100
-1 > -100
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash compare_num.sh
请输入两个数:100 100
100 = 100
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.2.3.2 检查磁盘分区的情况
- 磁盘有几个分区.
- 检查每个分区空间使用情况,60%警告,70%严重,80%比较严重,90%相当严重,95%灾难
sh check_disk.sh #输出样子
系统一共有4个分区
/分区使用率60%,使用正常
/boot/分区使用率70%,磁盘空间不足
/data/分区使用率80%,磁盘空间不足
xxx分区
- 流程:
- 获取系统磁盘分区名字 /etc/fstab 排除空行,注释的行,swap
- 统计磁盘分区数量 wc -l
- 取出所有分取名字,通过循环一个分区一个分区处理
- 获取分区使用率 df -h 分区名字 取出大小,使用率
- 对使用率进行判断
- 大于等于70 磁盘空间不足
- 小于70 磁盘空间正常
6.2.4 小结
- 通过if完成更为复杂判断。
- if判断可以使用条件(条件表达式),写命令。
- if [] 条件表达式(测试语句)
- if 命令 ==执行命令 $? -eq 0
if ! id $user &>/dev/null ;then
echo "用户不存在"
exit 2
fi
id $user &>/dev/null
if [ $? -ne 0 ] ;then
echo "用户不存在"
exit 2
fi
if ping -c baidu.com &>/dev/null ;then
echo "百度通畅的"
fi
ping -c baidu.com &>/dev/null
if [ $? -eq 0 ] ;then
echo "百度通畅的"
fi
6.3 case
6.3.1 概述
- 相当于是if中的字符串对比判断. (= !=) .比大小,文件,目录判断,正则只能使用if.
- 类似于条件分支语句,case一般用于实现有多种选择的脚本(菜单选择)。
- 这个功能:if或多分支if实现,如果使用case语句会更加清晰直观.
- 菜单。
- start|stop|restart|status
- 手写堡垒机.
- 环境部署脚本
case语句vs if多分支
- case 一般用于固定的菜单选择情况.运行脚本用户输入1,2,3,4.start|stop|restart....
- if 可以用于一些范围的比较.
6.3.1 格式与实战
6.3.1.1 case格式
case "变量" in
1)
命令
;;
2)
命令
;;
*)
命令(保底的默认输出)
esac
6.3.1.2 菜单展示
case_menu
#!/bin/bash
##############################################################
# File Name:case_test.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################
cat <<EOF
1 关机
2 重启
3 查看状态
EOF
read -p "请输入需求:" num
case $num in
1) echo 即将关机,请稍等;;
2) echo 即将重启;;
3) echo 正在查看状态,请稍后;;
*) echo 该服务暂时为开放
esac
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash case_test.sh
1 关机
2 重启
3 查看状态
请输入需求:1
即将关机,请稍等
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash case_test.sh
1 关机
2 重启
3 查看状态
请输入需求:6
该服务暂时为开放
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.3.1.3 判断用户输入的是yes还是no.
用户输入yes,y,Y,Yes 都表示yes
用户输入no,n,N,No 都表示no
#!/bin/bash
read -p "是否确认,输入yes or no :" y_n
case "$y_n" in
YES|yes|Y|y) echo "yes" ;;
NO|no|N|n) echo "no" ;;
*)
echo "error"
exit 1
esac
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash case_yes_no.sh
是否确认,输入yes or no :y
yes
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash case_yes_no.sh
是否确认,输入yes or no :n
no
6.3.1.2 判断系统发行版本
判断当前系统是kylin,ubuntu,centos,debian,xxxxx
系统是kylin或centos则输出红帽类系统,使用yum,rpm指令.
系统是debian或ubuntu则输出debian类系统,使用apt,dpkg指令.
核心问题:如何知晓当前系统发行版本和版本号
- 1. hostnamectl的Operating System:行的第3列 获取系统发行版本,但是版本号有问题.
- 2. 读取/etc/os-release文件 读取ID,VERSION_ID2个内容
#!/bin/bash
read -p "是否确认,输入yes or no :" y_n
case "$y_n" in
YES|yes|Y|y) echo "yes" ;;
NO|no|N|n) echo "no" ;;
*)
echo "error"
exit 1
esac
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_os.sh
红帽类系统:kylin,版本:V10
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#
6.3.1 case小结
- case与if类似. case中*(所有),|(或者).
- case应用场景,用于实现菜单选择功能,字符串(固定)对比.
- if+elif适用于数字或灵活场景.
- 进阶格式:
- 分支中可以使用|表示或者
- *号表示所有
6.4 判断小结
- 条件表达式格式: [] [[]] test , (())
- 判断文件,字符串,大小,逻辑,正则
- if判断:
- 单分支。
- 双分支。
- 多分支。
- case语句: 用户输入与不同的选择,相对固定的选择.
- 完成案例:比大小,输出指定用户信息,服务管理脚本(优化)。