一,for循环
1,for循环格式
for NUM in 1 2 3
for NUM in {1..3}
for NUM in `seq 1 3`
for NUM in {a..f}
for NUM in {1..$a} 注意:这个a要么在脚本里面声明了,要么export提升到环境或用户或系统级别了
for ((A=1;A<=10;A++))
for NUM in `seq 1 2 10` 2表示步长,没写默认步长为1
for NAME in westos linux 666 也是可以的echo $NAME依次打印westos linux 666
注意:
exit是完全中断脚本
break是跳出整个循环,但是循环之外的还是执行
continue是跳出本次循环,进入下一次循环
return不能直接用
for循环可以传递参数,里面的for可以使用外面的for的变量
shell编程练习
1,查看网段里面连通的主机
###如果连通蓝色背景输出ip,如果不连通输出空行
测试
2,备份数据库linux,mysql,test,,westos,并且放在/mnt/maysql_backup里面
[root@100 mnt]# mysql -uroot -EN -e "show databases;"
*************************** 1. row ***************************
information_schema
*************************** 2. row ***************************
linux
*************************** 3. row ***************************
mysql
*************************** 4. row ***************************
performance_schema
*************************** 5. row ***************************
test
*************************** 6. row ***************************
westos
#!/bin/bash
DATABASE_MESSAGE=`mysql -uroot -EN -e "show databases;" | grep -E "^\*|schema$" -v` 去掉以*开头和schema结尾的行 \对*转义
mkdir -p /mnt/mysql_dump
for DATABASE_NAME in $DATABASE_MESSAGE !!!!这里直接对变量$DATABASE_MESSAGE做循环,linux,mysql,test,westos依次赋值给DATABASE_NAME
do
mysqldump -uroot $DATABASE_NAME > /mnt/mysql_dump/${DATABASE_NAME}.sql
[ "$?" -eq "0" ] && {
echo -e "\033[47m$DATABASE_NAME is backuped \033[0m"
}
done
测试
成功!!!
注意:像这样的for DATABSE_NAME in $DATABASE_MESSAGE这样的很常用,这里的DATABASE_MESSAGE必须是已经显示在终端的列,这样写比较简单,但是要求不能有其他命令插在显示和for之间,也就是说如果是一个文件(userfile),那么这里要写for NAME in `cat userfile`!!!
二,while循环
1,格式
while 条件
do
done
shell编程练习
uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。
使用whiel时实刷新uptime
####sleep表示延时 echo -n表示不换行
测试
成功!!!
####如何发邮件?
[root@localhost ~]# echo hello world | mail -s "nihao" root 非交互式 -s表示主题是nihao
You have mail in /var/spool/mail/root
[root@localhost ~]# mail 直接查看
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
1 root Thu Jun 21 13:31 21/768 "nihao"
>N 2 root Thu Jun 21 13:31 20/757 "nihao"
&
Message 2:
From root@localhost.localname Thu Jun 21 13:31:52 2018
Return-Path: <root@localhost.localname>
From: root <root@localhost.localname>
Date: Thu, 21 Jun 2018 13:31:52 -0400
To: root@localhost.localname
Subject: nihao
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
Status: R
hello world 邮件内容
shell编程练习
根分区的使用量达到了80%就给root用户法邮件报警
#!/bin/bash
DISK_NUM=`df | awk '/\/$/{print $5}' | awk -F "%" '{print $1}'` \/是对\转义,打印以/结尾的行的第5列,然后以%为分隔符,打印第一列
while true
do
[ "$DISK_NUM" -ge "80" ] && { 如果大于80报警
echo "Your / will full !!! " | mail -s "warning" root
}
sleep 1 每隔1秒做一个while循环
done
测试
收到邮件!!!
shell编程练习
根分区的使用量达到了80%就直接在终端显示警告
[root@localhost ~]# ps
PID TTY TIME CMD
3645 pts/1 00:00:00 bash
8101 pts/1 00:00:00 ps
[root@localhost ~]# ps | awk '/bash$/{print $2}' 显示当前tty设备
pts/1
####直接显示在终端设备上
测试
成功!!!