shell脚本学习(二)

本文详细介绍了Shell脚本中的流程控制结构,包括if判断语句、for循环、while/until循环以及case条件判断。讲解了各种运算符、逻辑运算以及循环控制语句的使用,并通过实例展示了如何在脚本中应用这些概念。此外,还介绍了Shell函数的创建和调用,以及在实际场景中的应用,如nginx服务的管理脚本。
摘要由CSDN通过智能技术生成

七.shell流程控制-if判断语句

1.shell中的运算

1.1数学比较运算
  运算符解释
  -eq         等于
  -gt         大于
  -lt         小于
  -ge         大于或等于
  -le         小于或等于
  -ne         不等于
1.2 字符串比较运算
 运算符解释,注意字符串一定别忘了使用引号引起来
 ==          等于   
 !=          不等于
 -n          检查字符串的长度是否大于0  
 -z          检查字符串的长度是否为0
1.3 文件比较与检查
 -d  检查文件是否存在且为目录
 -e  检查文件是否存在
 -f  检查文件是否存在且为文件
 -r  检查文件是否存在且可读
 -s  检查文件是否存在且不为空
 -w  检查文件是否存在且可写
 -x  检查文件是否存在且可执行
 -O  检查文件是否存在并且被当前用户拥有
 -G  检查文件是否存在并且默认组为当前用户组
 file1 -nt file2  检查file1是否比file2新
 file1 -ot file2  检查file1是否比file2旧
1.4 逻辑运算
逻辑与运算       &&   
逻辑或运算       ||  
逻辑非运算       !
逻辑运算注意事项:
逻辑与 或 运算都需要两个或以上条件,逻辑非运算只能一个条件。
口诀:    
逻辑与运算      真真为真 真假为假   假假为假
逻辑或运算      真真为真 真假为真   假假为假
逻辑非运算      非假为真   非真为假
5.赋值运算
=      赋值运算符         a=10   name='baism'

2.if语法

2.1 单if语句

适用范围:只需要一步判断,条件返回真干什么或者条件返回假干什么。

if [ condition ]           #condition 值为true or false
   then
      commands
fi
2.2 if-then-else语句

适用范围:两步判断,条件为真干什么,条件为假干什么。

if [ condition ]
     then
          commands1
else
          commands2
fi
2.3 if-then-elif语句

适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件。

if [ condition 1]
     then
            commands1
elif [ condition 2]
     then
             commands2
  .......
else
            commandsX
fi

3.if高级应用

3.1条件符号使用双圆括号,可以在条件中植入数学表达式

例子如下:
在这里插入图片描述

3.2使用双方括号,可以在条件中使用通配符

通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
在这里插入图片描述


八.shell流程控制-for循环语句

1. for语法

1.1 for语法一
for var in value1 value2 ......
    do
        commands
done

例子如下:
在这里插入图片描述

1.2 for语法二

C式的for命令

for ((变量;条件;自增减运算  ))
   do
          代码块
done

例子如下:
在这里插入图片描述

2.循环控制语句

2.1 sleep N脚本执行到该步休眠N秒

例子如下:
监控主机是否存活的脚本
在这里插入图片描述

2.2 continue跳过循环中的某次循环

例子如下:
看段代码吧,默认循环输出1-9,但是使用continue跳过输出5
在这里插入图片描述

2.3 break 跳出循环继续执行后续代码

例子如下:
要求用户输入一个字母,当输入Q的时候退出

#!bin/bash
#要求用户输入一个字母,当输入Q的时候退出
for((;;))
	do
		read -p "char" ch
		if [ $ch=="Q" ]
			then
				#终止本循环
				break
				#如果循环多层嵌套,循环从里往外排序 1-N
				#如果想跳出某层循环 break N
		else
			echo "你输入的字符是:" $ch
		fi
done

九.shell流程控制-while 、until循环介绍

1. while 循环语法

while  [ condition ]      #注意,条件为真while才会循环,条件为假,while停止循环
 do
             commands
done

例子如下:
在这里插入图片描述

2.until循环语法

和while正好相反,until是条件为假开始执行,条件为真停止执行。

until [ condition ]      #注意,条件为假until才会循环,条件为真,until停止循环
 do
         commands代码块
done

例子如下:

#打印10-20数字
#!/bin/bash
init_num=10
until [ $init_num -gt 20 ]
   do
       echo $init_num
       init_num=$((init_num + 1))
done

#输出
[root@www ~]# sh until1.sh 
10
11
12
13
14
15
16
17
18
19
20

十.shell流程控制-case条件判断语句

1.case语法

语法:
case 变量  in 
条件1)
           执行代码块1
;;
条件2)
           执行代码块2
;;
......
esac
注意:每个代码块执行完毕要以;;结尾代表结束,case结尾要以倒过来写的esac来结束。

例子如下:

#!/bin/bash
read -p "NUM: " N
case $N in
1)
   echo haha
;;
2)
  echo hehe
;;
3)
   echo heihei
;;
*)
   echo bye
;;
esac
执行输出
[root@www ~]# sh x1 
NUM: 1
haha
[root@www ~]# sh x1 
NUM: 2
hehe
[root@www ~]# sh x1 
NUM: 3
heihei
[root@www ~]# sh x1 
NUM: 4
bye

2. shell 特殊变量

特殊参数
1. $*: 代表所有参数,其间隔为IFS内定参数的第一个字元
2. $@: 与*星号类同。不同之处在於不参照IFS
3. $#: 代表参数数量
4. $: 执行上一个指令的返回值
5. $-: 最近执行的foreground pipeline的选项参数
6. $$: 本身的Process ID
7. $: 执行上一个背景指令的PID
8. $_: 显示出最後一个执行的命令
9. $N: shell的第几个外传参数

例子如下:
在这里插入图片描述

运行结果如下:
在这里插入图片描述


十一.shell函数

1.函数语法

语法一:
函数名 () {
    代码块
    return N
    }
语法二:
function 函数名 {
      代码块
      return N
      }

2.函数的应用

函数名字命名参考变量一节中的变量命名规则,函数调用:定义好函数后,如果想调用该函数,只需通过函数名调用即可。
例子如下:

#!/bin/bash
N1 () {
echo "`date +%F`"
}
N2 () {
echo -e "\t\t\t\twelcome to ayitula"
echo -e "\n"
}
N3 () {
echo "1) 剪子"
echo "2) 石头"
echo "3) 布"
}
N4 () {
echo -e "\n\n\n"
read -p "请输入代码: " DL
}
#方便调整代码执行顺序
N2
#代码重复调用
N1
N1
N3
N4
输出
[root@www ~]# sh x2
                welcome to ayitula
2019-02-19
2019-02-19
1) 剪子
2) 石头
3) 布
请输入代码: 1

nginx启动管理脚本案例如下:

#!/bin/bash
#ngingx service manager scripts
#=====================variables
nginxdoc="/usr/local/nginx"
nginxd="$nginxdoc/sbin/nginx"
pid="$nginxdoc/logs/nginx.pid"
conf="$nginxdoc/conf/nginx.conf"
#====================function
mystart () {
   if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
      echo "nginx already run..."
      exit 0
   else
      if $nginxd ;then
         echo -e "nginx start\t\t\t\t[\033[32m OK \033[0m]"
      else
         echo -e "nginx start\t\t\t\t[\033[31m FAIL \033[0m]"
      fi
   fi
}
mystop () {
   if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
      if killall -s QUIT $nginxd;then
            echo -e "nginx stop\t\t\t\t[\033[32m OK \033[0m]"
      else
         echo -e "nginx stop\t\t\t\t[\033[31m FAIL \033[0m]"
      fi
   else
    echo "nginx already stop...."
   fi
}
myrestart () {
  mystop;sleep 2 ;mystart
}
myreload () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
   if killall -s HUP $nginxd;then
      echo -e "nginx reload\t\t\t\t[\033[32m OK \033[0m]"
      else
         echo -e "nginx reload\t\t\t\t[\033[31m FAIL \033[0m]"
      fi
else
    echo "nginx is stop...."
fi
}
mystatus () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
   echo "nginx is open"
else
  echo "nginx is stop"
fi
}
#===================main
#calld function
case $1 in 
start|START)
    mystart
;;
stop) mystop ;;
restart) myrestart ;;
reload) myreload ;;
status) mystatus ;;
esac

注:以上案例来自B站的UP主Python社区,结合博客和视频一起食用,效果更好哦
shell脚本视频链接:Shell脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值