Shell编程规范与变量二
目录
- 1. 条件测试
- 1.1 文件测试
- 1.2 数字测试
- 1.3 字符串测试
- 1.4 逻辑测试
- 1.5 双中括号
- 1.6 () {}
- 1.7 if语句
- 1.7.1 单分支
- 1.7.2 双分支
- 1.7.3 多分支
- 1.8 case命令
- 1.9 echo命令
- 2. 使用shell脚本编译安装nginx
1. 条件测试
-
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
-
test 测试文件的表达式 是否成立
格式1:test 条件表达式
格式2:[条件表达式]
注意[]空格,否则会失败
测试是否成功使用 $?返回值
[ 操作符 文件或目录 ]
help test
1.1 文件测试
-
条件测试
格式 [操作符 文件或目录]
-
常用的测试操作符
-d:测试是否为目录(Directory) -e:测试目录或文件是否存在(Exist) -f:测试是否为文件(File) -r:测试当前用户是否有权限读取(Read) -w:测试当前用户是否有权限写入(Write) -x:测试当前用户是否有权限执行(eXcute)
ll看到的并不实际有效,以实际操作结果为准
只要有一个执行权限,所有都有
1.2 数字测试
- 整数值比较
格式
[整数1 操作符 整数2]
- 常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
1.3 字符串测试
格式
[ 字符串1 == 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
- 常用的测试操作符
==:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在
1.4 逻辑测试
格式
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]...
格式2:命令1 操作符 命令2 ...
常见条件
-a 或 &&:逻辑与,“而且”的意思全真才为真
-o 或 ||:逻辑或,“或者”的意思一真即为真
!:逻辑否
且 与
第一个要真 第二个也为真才能是真
如果第一个为假,整个为假不用执行下个操作
[`id -u` -eqo ]&&
echo "该用户为超级管理员"
或
一真即为真
如果第一个为真 那么不用执行第二个
第二个为假 才需要执行第二个
1.5 双中括号
格式
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
1.6 () {}
格式
(CMD1;CMD2;...)和 {空格CMD1;CMD2;...; } 都可以将多个命令组合在一起,批量执行
1.7 if语句
- if是shell关键字
1.7.1 单分支
if:if 命令; then 命令; [ elif 命令; then 命令;] [ else 命令;] fi
单分支
if 判断条件;
then 条件为真的分支代码
fi
1.7.2 双分支
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
[root@localhost ~]#vim disk.sh
#!/bin/bash
use=`df -h | tr -s ' ' | cut -d ' ' -f5 | tail -n +2 | tr -d % | sort -rn | head -n 1`
# 你要发送的信息 | 使用邮件 -s 标题 发送方
#[$use -gt 80 ] && echo "disk will be full,please check it" | mail -s checkinfo 2450245982@qq.com || echo "磁盘正常"
if [ $use -gt 80 ]
then
echo "disk will be full"
else
echo "disk is normal"
fi
[root@localhost ~]#bash disk.sh
disk will be full
[root@localhost ~]#vim httpd.sh
#!/bin/bash
ss -natp | grep ':80' &>/dev/null
if [ $? -eq 0 ]
then
echo "httpd服务已启动"
else
systemctl start httpd
if [ $? -eq 0 ]
then
echo "启动成功"
else
echo "启动失败"
fi
fi
[root@localhost ~]#bash httpd.sh
httpd服务已启动
1.7.3 多分支
多分支
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi #结束标志
[root@localhost ~]#vim num.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" num
if [ $num -ge 85 -a $num -le 100 ]
then
echo "你棒呆了!"
elif [ $num -ge 60 -a $num -le 84 ]
then
echo "你及格了!"
elif [ $num -ge 0 -a $num -le 59 ]
then
echo "你不及格了"
else
echo "输入有误,请输入0-100之间的正整数"
bash $0
fi
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):90
你棒呆了!
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):60
你及格了!
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):30
你不及格了
1.8 case命令
格式
case $input in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac #表示case语句块的结束
1.9 echo命令
echo -n 表示不换行输出
echo -e 表示输出转义符
常用的转义符
2. 使用shell脚本编译安装nginx
#!/bin/bash
read -p "先测试网络是否连接(点击回车自动测试)" ip
ping -c 3 112.112.112.112
if [ $? -eq 0 ]
then
echo "网络正常"
read -p "是否开始安装nginx(yes/no)" key
key=`echo $key | tr 'A-Z' 'a-z'`
case $key in
y|yes)
if [ -f "nginx-1.18.0_.tar.gz" ]
then
echo "系统中有nginx源码包,请耐心等待安装......"
#关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0
#下载gcc编译环境
yum install gcc pcre-devel openssl-devel zlib-devel openssl -y
#切换opt目录
cd /opt
#将nginx包解压到opt目录下
tar xf $(find / -name "nginx-1.18.0\_.tar.gz") -C /opt
#切换nginx
cd nginx-1.18.0/
#设置安装路径
./configure --prefix=/apps/nginx
#编译成二进制
make -j2
#安装
make install
#做软链接
ln -s /apps/nginx/sbin/nginx /usr/local/sbin
#添加nginx.service的配置文件
echo "
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
">/usr/lib/systemd/system/nginx.service
#重新加载配置
systemctl daemon-reload
#启动nginx
systemctl start nginx
#查看nginx状态
systemctl status nginx
else
echo "没有nginx安装包,请先装包"
fi
;;
n|no)
echo "取消安装"
;;
*)
echo "输入有误!"
esac
else
echo "网络无连接"
fi