排序命令 | 条件判断 | 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