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 ];then
echo "use $0 file"
exit 1
fi
#3.check_link
if [ -L ${file} ];then
echo "${file}是软链接"
exit
fi
#4.check_file
if [ -f ${file} ];then
if [ -x ${file} ];then
excu=有执行权限
elif [ -s ${file} ];then
size=文件有内容,非空
else
excu=无执行权限
fi
echo "${file} 文件存在"
echo "${size}"
echo "${excu}"
exit
fi
#5.check_dir
if [ -d ${file} ];then
echo "${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 ];then
echo "use $0 service"
exit 1
fi
#3.check_running
running=`systemctl is-active $1`
if [ "${running}" = "active" ];then
echo "${service}正在运行"
else
echo "${service}没有运行"
fi
#4.check_enable
enable=`systemctl is-enabled $1`
if [ "${enable}" = "enabled" ];then
echo "${service}开机自启动"
else
echo "${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 ];then
echo "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" ];then
echo "${service}正在运行"
else
echo "${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 变量 in
start)
命令
;;
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} in
kylin|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语句