欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Shell编程语法

程序员文章站 2022-03-23 16:18:04
shell流程控制 流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法。 新知识点: /dev/dull:黑洞文件,此文件相当于windows的回收 ......

shell流程控制

流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法。

新知识点:

/dev/dull:黑洞文件,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程。

read -p:提示你输入一个东西

sleep 数字:间隔几秒显示

echo -n :对输出的结果不显示新行

sum=0 :意思是初始值为0,一般结合let ++使用。

read line :读取每行的内容

if语句(条件语句)

格式一:

#!/bin/bash

if  [ 条件表达式 ];then

命令(切记用tab键自动缩进一下,后期好排错)

fi

 格式二:

#!/bin/bash

if  [ 条件表达式 ]

then

命令(切记用tab键自动缩进一下,后期好排错)

fi

就是说你的条件表达式满足之后,你想干一些什么事情。

if分为单分支,双分支,多分支三种样式

单分支

if 条件表达式;then             

  命令(按tab键自动缩进一下)

fi

举例:如果你输入的参数是1,那么显示的结果是“您输入的数字是1”(运用到的知识点,shell的特殊变量)

#!/bin/bash
if [ $1 -eq 1 ];then
        echo "您输入的数字是$1"
fi

双分支(当条件表达式里的命令执行不成功时,就会执行else)

if 条件表达式;then

  命令(按tab键自动缩进一下)

else

  命令(按tab键自动缩进一下)

fi

举例:如果输入不是1的其他数字,显示的结果就是“您输入的数字不是1”

if [ $1 -eq 1 ];then
        echo "您输入的数字是: $1"
else
        echo "您输入的数字不是1"
fi

双分支运用实例

利用双分支检测一下crond是否开启

#!/bin/bash
soft=crond
status_crond=`ps aux | grep "crond" | grep -v "grep" | wc -l`
if [ $status_crond -eq 1 ];then
        echo "$soft 正在运行!"
else
        echo "$soft 未运行"
fi

  利用双分支检查主机是否在线(黑洞文件,/dev/dull,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程,只显示echo的输出结果,给用户一个好的体验。)

#/bin/bash
ip=192.168.1.9
ping -c 1 -w $ip &> /dev/null
if [ $? -eq 0 ];then
    echo "$ip在线"
else
    echo "$ip不在线"
fi

多分支

if 条件表达式;then

  命令(按tab键自动缩进一下)

elif 条件表达式;then

  命令(按tab键自动缩进一下)

else

  命令(按tab键自动缩进一下)

fi

read –p:提示你输入一个东西

#!/bin/bash
read -p "请输入一个数字: "num
if [ $num -le 5 ];then
        echo "您输入的$num小于等于5"
elif [ $num -gt 5 -a $num -le 10 ];then
         echo "您输入的$num大于5小于等于10"
elif [ $num -gt 10 -a $num -le 20 ];then
         echo "您输入的$num大于10小于等于20"
elif [ $num -gt 20 -a $num -le 30 ];then
         echo "您输入的$num大于20小于等于30"
elif [ $num -gt 30 -a $num -le 40 ];then    
         echo "您输入的$num大于30小于等于40"
else
         echo "您输入的数字大于40!"
fi

多分支运用实例

利用多分支编写一个简单的计算器

#!/bin/bash
read -p "请输入第一个数字: "num1
read -p "请输入运算符号: "num2
read -p "请输入第二个数字: "num3
if [ -n "$num1" -a -n "$num2" -a -n "$num3" ];then
        if [ "$num2" == "+" ];then
                echo "${num1}${num2}${num3}=$((num1+num3))"
        elif [ "$num2" == "-"];then
                echo "${num1}${num2}${num3}=$((num1-num3))"
        elif [ "$num2" == "*"];then
                echo "${num1}${num2}${num3}=$((num1*num3))"
        elif [ "$num2" == "/"];then
                echo "${num1}${num2}${num3}=$((num1/num3))"
        else
                echo "请输入+-*/"
        fi
else
        echo "请输入数字或运算符"
fi

利用多分支检查用户是否存在

#!/bin/bash
read -p "请输入一个用户: "user
if id $user &> /dev/null;then
        echo "$user存在"
else
        echo "$user不存在!"
fi

for语句(循环语句,主要用于批量管理、检测)

书写格式:

第一种书写格式:

for 变量名 in 取值列表; do

  命令

done

第二种书写格式:

for 变量名 in 取值列表

do

  命令(切记首行缩进,tab键)

done

输出一个1至9的数列,每2秒输出一行

#!/bin/bash
for i in `seq 9`
do
        echo "$i"
        sleep 2
done

运用实例

批量检测主机是否在线,在这里,ip是一个变量,i也是一个变量,两者的结合,就组成了ip。\

#!/bin/bash
ip=192.168.1.
for i in {1..255}
do
        if ping -c 1 -w 1 $ip$i &> /dev/null;then
                echo "$ip$i在线"
        else
                echo "$ip$i不在线"
        fi
done

工作中的检测ip是否在线

#!/bin/bash
./etc/init.d/functions
ip=192.168.1.
for i in {1..255}
do
        if ping -c 1 -w 1 $ip$i &> /dev/null;then
                echo  -n"$ip$i"
                success
                echo ""
        else
                echo -n"$ip$i"
                failure
                echo ""
        fi
done                                                    

求1到100的奇数和是多少(运用到前面学习的let ++)

#!/bin/bash
sum=0
for i in `seq 1 2 100`
do
        let sum+=$i
done
echo $sum

练习:判断一下/root的文件类型

while循环语句(一般做的是死循环,条件为假就退出循环)

书写格式:

while 条件表达式; do

    命令

done

这个是说只会循环1至5一次,当let++的值大于5时,就停止循环。

#!/bin/bash
sum=0
while [ $sum -lt 5 ]
do
        let sum++
        echo $sum
done

死循环,就是条件永为真

第一种永为真的方式:

#!/bin/bash
sum=0
while true
do
        let sum++
        echo $sum
        sleep 2
done

第二种永为真的方式:

#!/bin/bash
sum=0
while [1 -eq 1]
do
        let sum++
        echo $sum
done

while运用实例

检测在线终端数量,这种虽然占用终端,但是把输出的内容写入到了/root/ter这个文件之中。

#!/bin/bash
while true
do
        num=`who | wc -l`
        echo "当前终端数量为$num" >> /root/ter
        sleep 5
done
#!/bin/bash
while true
do
        num=`who | wc -l`
        if [ $num -eq 5 ];then
            mail -s "当前在线终端数量达到预警值"
            exit
        fi
done

 如何把一个文本一行一行的读取出来

#!/bin/bash
cat /etc/passwd | while read line
do
        echo $line
        sleep 2
done
#!/bin/bash
while read line
do
        echo $line
        sleep 2
done < /etc/passwd

如何在不占用终端的情况下还在持续检测,方法有两种。

一:bash 脚本名称 & 而后再开一个终端tail –f 监测输出到文本即可。但是关掉运行此命令的终端,监测就会停止。

二:nohup bash 脚本名称 & 这样既不会占用当前终端,关掉当前运行此命令的终端也不会打断监测。

nohup意为挂起,他会生成一个nohup.out文件。

break(终止循环,停止当前的循环)和continue(跳出本次循环,就是你设置之后,不显示你设置的内容,之后进入死循环)语句

意思就是只输出1至4,到5的时候,就停止循环。

#!/bin/bash
sum=0
while true 
do
    
    let sum++
       if [ $sum -eq 5 ];then
            break
        fi
        echo $sum
done

意思就是只显示1至10,但不显示5,当let ++的值大于10时,就停止此循环。

#!/bin/bash
sum=0
while true 
do
    
    let sum++
       if [ $sum -eq 5 ];then
            continue
       elif [ $sum -gt 10 ];then
            break
        fi
        echo $sum
done
#!/bin/bash
sum=0
while true 
do
    
    let sum++
       if [ $sum -eq 5 ];then
            continue
       elif [ $sum -gt 10 ];then
            exit
        fi
        echo $sum
done

case语句(用于centos6系统书写程序启动脚本)

书写格式:

case 模式名    in
模式 1)

  命令

  ;;

模式 2)

  命令

  ;;

*)

  不符合以上模式执行的命令

esac
#!/bin/bash
function start {
        if  [ -e /pid ];then
                echo "httpd is running"
        else
            /usr/local/httpd/bin/apachectl start 
        fi
}
function stop {
        if  [ -e /pid ];then
            /usr/local/httpd/bin/apachectl stop
        fi
}
function restart {
        if  [ -e /pid ];then
                /usr/local/httpd/bin/apachectl stop
                /usr/local/httpd/bin/apachectl start
        else
            /usr/local/httpd/bin/apachectl start 
        fi
}
case $1 in

练习

打印九九乘法口诀表

#!/bin/bash
for i in `seq 9`
do 
        for a in `seq 9`
        do
                if [ $a -lt $i ];then
                    echo -n "$a*$i=$((a*i))"
                fi
         done
         echo "" 
done

持续监测内存剩余量

#!/bin/bash
while true
do
        free=$(free -h | grep "men" | cut -d "m" -f 4 | tr -d "  ")
        if [ free -lt 500];then
            mail -s "当前内存剩余低于预警值"
        fi
done