Shell编程2

1.2 条件判断

1.2.1 按照文件类型进行判断

-b 文件 是否存在且为状设备文件

-c 文件 是否存在且为字符设备文件

-d 文件 是否存在且为目录

-e 文件 是否存在

-f 文件 是否存在且为普通文件

-L 文件 是否存在且为符号链接文件

-p 文件 是否存在且为管道文件

-s 文件 是否存在且为非空

-S 文件 是否存在且为套接字文件

 

常用

-d 文件 是否存在且为目录

-e 文件 是否存在

-f 文件 是否存在且为普通文件

 

两种判断格式

test -e /root/install.log

[ -e /root/install.log ] && echo "yes" || echo "no"

 

echo $? 判断上一条命令是否正确 0为正确

 

1.2.2 按照文件权限进行判断

-r 文件 是否存在并且可读

-w 文件 是否存在并且可写

-x 文件 是否存在并且可运行

-u 文件 是否存在并且有SUID权限

-g 文件 是否存在并且有SGID权限

-k 文件 是否存在并且有SBit权限

 

1.2.3 两个文件之间进行比较

文件1 -nt 文件2      文件1的修改时间是否比文件2

文件1 -ot 文件2      文件1的修改时间是否比文件2

文件1 -ef 文件2      判断Inode号是否一致,是否为同一个文件。可用于判断硬连接。

 

1.2.4 两个整数之间比较

整数1 -eq 整数2 是否相等

整数1 -ne 整数2   是否不等

整数1 -gt 整数2   是否大于

整数1 -lt 整数2   是否小于

整数1 -ge 整数2   是否大于等于

整数1 -le 整数2   是否小于等于

 

1.2.5 字符串判断

-z 字符串 是否为空

-n 字符串 是否非空

字串1 == 字串2 是否相等

字串1 != 字串2 是否不等

 

name=sc //等号两边不能有空格

[ -z "$name" ] && echo yes || echo no

no 结果

 

1.2.6 多重条件判断

判断1 -a 判断2 逻辑与

判断1 -o 判断2 逻辑或

判断 逻辑非,原始判断取反

 

1.3 流程控制

if  case  for  while

11.3.1单分支if条件语句

if [ 条件判断式 ];then

    程序

fi

 

if [ 条件判断式 ]

  then

    程序

fi

所有的计算机技术,不是学会的,而是练会的。


例子

#!/bin/bash

#统计根分区使用率

 

rate=$(df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1)

#把根分区使用率作为变量值赋予变量rate

 

if [ $rate -ge 80 ]

  then

    echo "Warning! /dev/sda2 is full!!!"

fi

 

1.3.2 双分支if条件语句

if [ 条件判断式 ]

    then

        条件成立时,执行的程序

    else

        条件不成立时,执行的另一个程序

fi

 

例子

#!/bin/bash

#备份mysql数据库

 

ntpdate asia.pool.ntp.org &>/dev/null

#同步系统时间             输出内容丢弃

 

date=$(date +%y%m%d)

#时间戳

 

size=$(du -sh /var/lib/mysql)

#统计mysql数据库的大小

 

if [ -d /tmp/dbbak ]

    then

echo "Date : $date!" > /tmp/dbbak/dbinfo.txt

echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt

cd /tmp/dbbak

tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt

        &>/dev/null

rm -rf /tmp/dbbak/dbinfo.txt

    else

mkdir /tmp/dbbak

echo "Date : $date!" > /tmp/dbbak/dbinfo.txt

echo "Data size : $size" >> /tmp/dbbak/dbiinfo.txt

cd /tmp/dbbak

tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt

        &>/dev/null

rm -rf /tmp/dbbak/dbinfo.txt

fi

 

 

启动Apache

service httpd start

查询Apache是否启动

ps aux | grep httpd

判断端口

netstat -tlun

安装nmap工具

yum -y install nmap

 

例子

#!/bin/bash

#判断Apache是否启动

port=$(nmap -sT 192.168.143.132 | grep tcp | grep http | awk '{print $2}')

#使用nmap命令扫描服务器,并截取Apache服务的状态,赋予变量prot

 

if [ "$port" == "open"]

    then

echo "$(date) httpd is OK!" >> /tmp/autostart-acc.log

    else

  /etc/rc.d/init.d/httpd start &>/dev/null

echo "$(date) restart httpd!!" >> /tmp/autostart-err.log

fi

 

1.3.3 多分支if条件语句

if [ 条件判断式1 ]

  then

    当条件判断1成立时,执行程序1

elif [ 条件判断式2 ]

  then

    当条件判断2成立时,执行程序2

...

 

else

    当所有条件都不成立时,最后执行此程序

fi

 

例子

#!bin/bash

#判断用户输入的是什么文件

 

read -p "Please input a filename: " file

#接收键盘的输入,并赋予变量file

 

if [ -z "$file" ]

#判断file变量是否为空

    then

echo "Error, please input a filename."

exit 1

elif [ ! -e "$file" ]

#判断file的值是否存在

    then

echo "Your input is not a file!"

exit 2

elif [ -f "$file" ]

#判断file的值是否为普通文件

    then

echo "$file is a regulare file!"

elif [ -d "$file"]

#判断file的值是否为目录文件

    then

echo "$file is a directory!"

else

echo "$file is an other file!"

fi

 

1.3.4 case语句

case $变量名 in

    "1")

        程序1

        ;;

    "2")

        程序2

        ;;

    ... ...

    *)

        如果哦变量值都不是以上的值,此程序

        ;;

esac

 

1.3.5 for循环

语法一

for 变量 in 1 2 3 ...

    do

      程序

    done

 

例子

#/bin/bash

#打印时间

for time in morning noon afternoon evening

    do

        echo "This time is $time!"

    done

 

#!/bin/bash

#批量解压缩脚本

cd /lamp

ls *.tar.gz >ls.log

for i in $(cat ls.log)

    do

      tar -zxf $i &>/dev/null

    done

rm -rf /lamp/ls.log

 

语法二

for ((初始值;循环控制条件;变量变化))

  do

    程序

  done

 

例子

#!/bin/bash

#1加到100

s=0

for((i=1; i<=100; i=i+1))

  do

    s=$(($s+$i))

  done

echo "The sum of 1+2+...+100 is : $s"

 

#!/bin/bash

#批量添加指定数量的用户

read -p "input user name: " -t 30 name

read -p "input the number of user: " -t 30 num

read -p "input the password of user: " -t 30 pass

if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]

    then

    y=$(echo $num | sed 's/[0-9]//g')

        if [ -z "$y" ]

    then

    for((i=1; i<=$num; i=i+1))

   do

    /usr/sbin/useradd $name$i &>/dev/null

    echo $pass |/usr/bin/passwd--stdin $name$i &>/dev/null

done

fi

fi

 

1.3.6 while循环

不定循环,也称作条件循环。

只要条件判断式成立,循环就会一直继续。

for的固定循环不太一样。

 

while [ 条件判断式 ]

  do

    程序

  done

 

例子

#!/bin/bash

#1加到100

i=1

s=0

while [ $i -le 100 ]

  do

    s=$(($s+$i))

    i=$(($i+1))

  done

echo "The sum is: $s"

 

until循环

while循环相反,只要条件判断式不成立则进行循环

 

until [ 条件判断式 ]

  do

    程序

  done

 

例子

#!/bin/bash

#1加到100

i=1

s=0

util [ $i -gt 100 ]

  do

    s=$(($s+$i))

    i=$(($i+1))

  done

echo "The sum is: $s"

脚本语言:不适用于数值计算,主要用于辅助系统运维工作

好处:无需编译,所见即所得

坏处:运行速度慢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值