Shell编程规范与变量二

Candy独角兽 / 2023-08-11 / 原文

目录
  • 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