day28-shell编程-2
1. $*和$@区别
$* 加双引号"$*"在循环中,会将所有的参数合并成一个参数$@ 加双引号"$@"在循环中,所有的参数单独输出,一个一个输出
2. 特殊变量-不常用
特殊符号 | |
$$ | 记录当前脚本的pid |
$! | 记录上一个脚本的pid |
$_ | 记录上一个命令最后一个参数,使用esc + . 可以调取这个参数 |
${#变量} | 变量的字符数 |
3. 判断
- 条件表达式/条件测试语句
&& 并且,前一个命令成功,然后执行后面的命令
|| 或者,前一个命令失败,然后执行后面的命令
3.1. 文件目录相关判断
文件目录判断 | |
-f | 文件是否存在 |
-d | 目录是否存在 |
-x | 文件是否有执行权限 |
-s | 文件存在,大小大于0 |
-h或-L | 软链接是否存在 |
3.1.1. 案例
- 案例01:属性文件类型检查脚本
1.判断是否为文件判断是否有执行权限判断大小是否为0
2.判断是否为目录
3.判断是否为软链接
4.输出其他类型文件......
#!/bin/bash
##############################################################
# File Name: check_type.sh
# Version: V1.0
# Author: zbl
# Organization: www.zbl.com
# Description:
###############################################################1.vars
file=$1#2.check
if [ $# -ne 1 ];thenecho "use $0 file"exit 1
fi#3.check_link
if [ -L ${file} ];thenecho "${file}是软链接"exit
fi#4.check_file
if [ -f ${file} ];thenif [ -x ${file} ];thenexcu=有执行权限 elif [ -s ${file} ];thensize=文件有内容,非空elseexcu=无执行权限fiecho "${file} 文件存在"echo "${size}"echo "${excu}"exit
fi#5.check_dir
if [ -d ${file} ];thenecho "${file}是目录"exit
fi#6.其他
echo "${file}是其他类型"
3.2. 字符串对比
字符串对比 | |
"字符" = "字符" | 字符串等于 |
!= | 不等于 |
-z | zero是否为空 |
-n | not zero不为空 |
3.2.1. 案例
- 案例09:书写服务检查脚本,检查服务是否运行,检查服务是否开机自启动
- 脚本流程
1.bash check_service.sh crond
2.是否正在运行
3.是否开机自启动
- 编写脚本
#!/bin/bash
##############################################################
# File Name: check_service.sh
# Version: V1.0
# Author: zbl
# Organization: www.zbl.com
# Description:
###############################################################1.vars
service=$1
#2.check
if [ $# -ne 1 ];thenecho "use $0 service"exit 1
fi#3.check_running
running=`systemctl is-active $1`
if [ "${running}" = "active" ];thenecho "${service}正在运行"
elseecho "${service}没有运行"
fi#4.check_enable
enable=`systemctl is-enabled $1`
if [ "${enable}" = "enabled" ];thenecho "${service}开机自启动"
elseecho "${service}没有自启动"
fi
3.3. 逻辑
逻辑 | |
-a | and 并且 |
-o | or 或者 |
! | 取反 |
案例:
#!/bin/bash
##############################################################
# File Name: check_servicev2.sh
# Version: V1.0
# Author: zbl
# Organization: www.zbl.com
# Description:
###############################################################1.vars
service=$1
#2.check
if [ $# -ne 1 ];thenecho "use $0 service"exit 1
fi#3.check_running
running=`systemctl is-active $1`
enable=`systemctl is-enabled $1`
if [ "${running}" = "active" -a "${enable}" = "enabled" ];thenecho "${service}正在运行"
elseecho "${service}没有运行,没有开机自启动"
fi
3.4. 正则
- 对变量内容进行匹配,一般用于检查
[[ "$id" =~ ^[0-9]+$ ]]
3.5. 面试题:[] vs [[]]区别
[] | [[]] |
无法使用正则 | =~可以使用正则 |
比较大小-eq -ne -gt -ge -lt -le | 比较大小== != > >= < <= |
逻辑符号 -a -o ! | 逻辑符号&& || ! |
4. 各种各样的判断
- 多分支
- case语句
4.1. 多分支
if [];then命令1
elif [];then命令2
elif [];then命令3
else命令4
fi
4.1.1. 案例
- 案例11:统计根分区磁盘使用率60-70输出警告,70-80输出需要处理,80-95及时处理,95以上立刻处理
1.sh check_disk.sh
2.取出根分区使用率
3.多分支判断
4.2. case语句
- 类似于多分支判断,一般用来实现菜单选择的功能
case 变量 instart)命令;;stop)命令;;status)命令;;*)echo 错误信息
esac
- 案例12:判断系统脚本
1.#获取系统名kylin/ubuntu/rocky/centos
2.交给case做判断1
#!/bin/bash
##############################################################
# File Name: check_os.sh
# Version: V1.0
# Author: zbl
# Organization: www.zbl.com
# Description:
###############################################################1.vars
source /etc/os-release#2.case
case ${ID} inkylin|centos|rocky)echo "当前操作系统为${ID},请使用yum安装软件和rpm检查";;ubuntu|debian)echo "当前操作系统为${ID},请使用atp安装软件和dpkg检查";;*)echo "未识别的操作系统"exit 1
esac
- sh/bash 与source / .
sh/bash运行脚本在子shell中创建,涉及到变量,变量仅在子环境生效source 或 . 运行脚本在当前shell中运行,复制出文件内容,粘贴到当前shell
加载子脚本
加载自定义函数库
5. 总结
- 文件判断 -f -d -L/-h -s -x
- 字符串 = != -z -n
- 逻辑-a -o !
- 正则 [[]]
- [] [[]]区别
- 多分支判断
- case语句