Shell编程二

排序命令 | 条件判断 |  if语句 | case语句 | for循环 | while循环

[root@localhost ~]# sort [选项] 文件名
选项:
    -f: 忽略大小写
    -n: 以数值型进行排序,默认使用字符串型排序
    -r: 反向排序
    -t:  指定分隔符,默认分隔符是制表符
    -k n[,m]: 按照指定的字段范围排序。从第n字段开始,
               m字段结束(默认到行尾)

排序/etc/passwd,反向排序

[root@localhost ~]# sort -r /etc/passwd
user4:x:1004:1004::/home/user4:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash

指定分隔符是':',用第三字段开始,第三个字段结束排序,就是用第三个字段排序

[root@localhost ~]# sort -t ":" -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hc:x:1000:1000:hc:/home/hc:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
user4:x:1004:1004::/home/user4:/bin/bash

指定分隔符是':',用第三字段开始,第三个字段结束排序,就是用第三个字段排序
把字段当作数值型来进行排序

[root@localhost ~]# sort -n  -t ":" -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

统计命令

[root@localhost ~]# wc [选项] 文件名
选项:
    -l            只统计行数
    -w            只统计单词数
    -m            只统计字符数

################################################################

条件判断

1、根据文件类型进行判断(常用加粗)

测试选项 作用
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,且是否为字符设备文件
-d 文件 判断该文件是否存在,且是否为目录文件
-e 文件 判断该文件是否存在
-f 文件 判断该文件是否存在,且是否为普通文件
-L 文件 判断该文件是否存在,且是否为符号链接文件
-p 文件 判断该文件是否存在,且是否为管道文件
-s 文件 判断该文件是否存在,且是否为非空
-S 文件 判断该文件是否存在,且是否为套接字文件    

两种判断格式

[root@localhost ~]# test -e /root/install.log
#中括号必须由空格
[root@localhost ~]# [ -e /root/install.log ]

[root@localhost ~]# [ -e /root/install.log ] && echo 'yes' || echo 'no'
no

2、按照文件权限进行判断

测试选项 作用
-r 文件 判断该文件是否存在,且是否拥有读权限
-w 文件 判断该文件是否存在,且是否拥有写权限
-x 文件 判断该文件是否存在,且是否拥有执行权限
-u 文件 判断该文件是否存在,且是否该文件拥有SUID权限
-g 文件 判断该文件是否存在,且是否该文件拥有SGID权限
-k 文件 判断该文件是否存在,且是否有用sBit权限

3、两个文件之间进行比较判断

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,这个判断是否是硬链接

4、两个整数之间比较

测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(equal)
整数1 -ne 整数2 判断整数1是否和整数2不相等(unequal)
整数1 -gt 整数2 判断整数1是否大于整数2(greater than)
整数1 -lt 整数2 判断整数1是否小于整数2(less than)
整数1 -ge 整数2 判断整数1是否大于等于整数2(greater than equal)
整数1 -le 整数2 判断整数1是否小于等于整数2(less than equal)

5、字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空
-n 字符串 判断字符串是否为非空
字符串1 == 字符串2 判断字符串1和字符串2是否相等
字符串1 != 字符串2 判断字符串1和字符串2是否不相等

-z字符串为空才是真

[root@localhost ~]# name=sc
[root@localhost ~]# [ -z "$name"] && echo yes || echo no
yes

6、多重条件判断

测试选项 作用
判断1 -a 判断2 逻辑与,判断1和判断2都成立
判断1 -o 判断2 逻辑或,判断1或判断2由一个成立
!判断 逻辑非,是原始的判断式取反
[root@localhost ~]# aa=24
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo yes || echo no
yes

流程控制

if语句 | case语句 | for循环 | while循环

1、单分支if条件语句

if [ 条件判断式 ];then
    程序
fi
或者
if [ 条件判断式 ]
    then
        程序
fi

例子1:判断分区使用率

#!/bin/bash
#统计根分区使用率,



#把根分区使用率作为变量赋予变量rate
rate = $(df -h | grep '/dev/sda2' | awk '{print $5}' | cut -d "%" -f 1)


if [ $rate -ge 80 ]
    then
        echo "Warning! /dev/sda3 is full"
fi

例子2:备份mysql数据库


 

#!/bin/bash
#备份mysql数据库

ntpdate asia.pool.ntp.org &> /dev/null
#同步系统时间
date=$(date +"%y%m%d")
#取日期字符串
size=$(du -sh /var/lib/mysql)
#取数据库目录大小

if [ -d /tmp/dbbak ]
	then 
		echo "Date: $date!" > /tmp/dbbak/dbinfo.txt
		echo "Data size:$size" >> /tmp/dbbak/dbinfo.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/dbinfo.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

例子3:判断apache是否启动

安装nmap
[root@localhost ~]# yum -y install nmap


#!/bin/bash
port=$(nmap -sT 192.168.1.111 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
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

case

case $变量名 in
	"值1")
		如果变量值等于值1,则执行程序1
		;;
	"值2")
		如果变量值等于值2,则执行程序1
		;;
	*)
		默认执行
		;;
esac

例子1:

#!/bin/bash
read -p "Please choose yes/no:" -t 30 cho
case $cho in
	"yes")
		echo "Your choose is yes!"
		;;
	"no")
		echo "Your choose is no"
		;;
	*)
		echo "Your choose is error!"
		;;
esac

for

语法一:
for 变量1 in 值1 值2 值3 
    do
        程序
    done

例子1:

#!/bin/bash

for time in moring noon afternoon evening
	do 
		echo "This time is $time!"
	done

例子2:批量解压缩脚本

#!/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

例子1: 从1加到100

#!/bin/bash
s=0
for((i=1;i<=100;i=i+1))
	do
		s=$(($s+$i))
	done
	
echo "The sum of 1+2+..+100 is : $s"

例子2:批量添加帐号

#注意if后面要有空格,!前后要有空格
#!/bin/bash
read -t 30 -p "please input name:" name
read -t 30 -p "please input num:" num
read -t 30 -p "please input pass:" 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
                                                        useradd $name$i &> /dev/null
                                                        echo $pass | passwd --stdin "$name$i" &> /dev/numm
                                                done
                        fi

fi

while和until循环


while [ 条件判断式 ]
    do
        程序
    done

例子1: 从1加到100

#!/bin/bash

i=1
s=0
while [ $i -le 100 ]
	do
		s=s(( $s+$i ))
		i=$(( $i+1 ))
	done
	
echo "This sum is:$s"

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


until [ 条件判断式 ]
    do
        程序
    done
 

猜你喜欢

转载自blog.csdn.net/qq_28710983/article/details/81813306