day59-day-shell-for
1.什么是循环
2.什么是for循环
3.for循环语法
4.for练习
需求1:批量探测某个网段的主机存活状态,将存活的主机存入ok.txt文件中。
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-11.sh # URL: https://www.xuliangwei.com # Description: for i in {1..254} do { ip=10.0.0.$i ping -W1 -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip 存活" fi }& done wait
需求2:判断主机存活状态,要求判断三次,如果三次失败则失败。
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-11.sh # URL: https://www.xuliangwei.com # Description: for i in {1..254} do { ip=10.0.0.$i ping -W1 -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip 存活" >> ok.txt else #如果判断第一次不存活,则在进行一次for循环,循环3次 for j in {1..3} do ping -W1 -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip 存活" >> ok.txt else echo "$ip 不存活" >> err.txt fi done fi }& done wait
需求3:现在有一个ip.txt的文件,里面有很多IP地址。
还有一个port.txt的文件,里面有很多端口号。
现在希望对ip.txt的每个IP地址进行端口的探测,探测的端口号来源于port.txt文件中
最后将开放的端口和IP保存到一个ok.txt文件。
ip.txt port.txt
10.0.0.1 80
10.0.0.2 22
10.0.0.3 3306
10.0.0.4 23
10.0.0.5 443
10.0.0.6 9000
10.0.0.7 123
10.0.0.8 6379
10.0.0.9 10050
172.16.1.5 10051
192.168.10.1
172.16.1.6
[root@manager for]# cat for-13.sh #!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-13.sh # URL: https://www.xuliangwei.com # Description: #遍历文件中的IP地址 for ip in $(cat ip.txt) do #第二次循环,遍历文件中的端口号 for port in $(cat port.txt) do #探测IP与端口的存活状态 nc -z -w 1 $ip $port &>/dev/null if [ $? -eq 0 ];then echo "$ip $port is ok" fi done done
需求4:获取系统的所有用户并输出。效果如下:
This is 2 user: bin This is 3 user: daemon This is 4 user: adm ............... 1.怎么获取所有的用户 awk -F ":" '{print $1}' 2.遍历/etc/passwd 这个文件 3.如何让数字的编号进行自增
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-14.sh # URL: https://www.xuliangwei.com # Description: i=1 for user in $(awk -F ":" '{print $1}' /etc/passwd) do echo This is ${i} $user #let i++ i=$[ $i + 1 ] done
需求5:批量创建100个用户,比如输入oldxu则会创建oldxu001-100。
1.怎么输出001-100 seq -w 1 100
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-15.sh # URL: https://www.xuliangwei.com # Description: for user in $(seq -w 1 100) do useradd $1$user echo "$1$user is ok" done
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-15.sh # URL: https://www.xuliangwei.com # Description: for user in $(seq -w 1 10) do id $1$user &>/dev/null if [ $? -ne 0 ];then useradd $1$user echo "$1$user is ok" else #表示结束当前本次的循环,直接开始下一次循环 continue fi done
需求6:批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。
read -p "请输入你需要创建的前缀: " qz read -p "请输入你需要创建的数量: " hz read -p "你要创建的用户是 $qz , 个数是 $hz 你确定要创建吗? [ y | n ] " : Action case $Action in y|yes|Y) for number in $(seq $hz) do username=$qz$number id $username &>/dev/null if [ $? -ne 0 ];then useradd $username echo "$username is ok" else #表示结束当前本次的循环,直接开始下一次循环 continue fi done ;; n|no|N) echo "Bey!" exit ;; *) echo "Gdx" exit esac
需求7:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。
例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。
[root@manager for]# cat useradd-new.sh #!/usr/bin/bash read -p "请输入你需要创建的前缀: " qz if [ -z $qz ];then echo "回车做什么 gdx...." exit fi read -p "请输入你需要创建的数量: " hz if [[ ! $hz =~ ^[0-9]+$ ]];then echo "让你输数字,,,,emm" exit fi read -p "你要创建的用户是 $qz , 个数是 $hz 你确定要创建吗? [ y | n ] " Action case $Action in y|yes|Y) for number in $(seq $hz) do username=$qz$number id $username &>/dev/null if [ $? -ne 0 ];then useradd $username echo "$username is ok" else #表示结束当前本次的循环,直接开始下一次循环 continue fi done ;; n|no|N) echo "Bey!" exit ;; *) echo "Gdx" exit esac
需求8:循环批量创建用户,需要填入用户的数量、用户的前缀、用户的统一密码(使用read、case、for语句)
#!/usr/bin/bash read -p "请输入你需要创建的前缀: " qz if [ -z $qz ];then echo "回车做什么 gdx...." exit fi read -p "请输入你需要创建的数量: " hz if [[ ! $hz =~ ^[0-9]+$ ]];then echo "让你输数字,,,,emm" exit fi read -p "请输入所有用户统一的密码: " pw read -p "你要创建的用户是 $qz , 个数是 $hz 密码是 $pw 你确定要创建吗? [ y | n ] " Action case $Action in y|yes|Y) for number in $(seq $hz) do username=$qz$number id $username &>/dev/null if [ $? -ne 0 ];then useradd $username echo "$pw" | passwd --stdin $username echo "$username $pw is create ok" else #表示结束当前本次的循环,直接开始下一次循环 continue fi done ;; n|no|N) echo "Bey!" exit ;; *) echo "Gdx" exit esac
需求9:通过读入文件中的用户,进行批量添加用户。
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: user-file.sh # URL: https://www.xuliangwei.com # Description: for user in $(cat user.txt) do useradd $user done
需求10:通过读入文件中的用户与密码文件,进行批量添加用户。文件中的格式: user:passwd
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: user-file.sh # URL: https://www.xuliangwei.com # Description: for user in $(cat user.txt) do us=$(echo $user|awk -F ":" '{print $1}') pw=$(echo $user|awk -F ":" '{print $2}') id $us &>/dev/null if [ $? -eq 0 ];then continue else useradd $us echo "$pw" | passwd --stdin $us &>/dev/null echo "$us is create ok......" fi done
需求11: 批量创建用户,用户名oldxu01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中.
mkpasswd -l
oldxu01:dasd1#!@#!@dsa
oldxu02:dascxasdas1!@#
[root@manager-61 ~/for]#cat for19.sh #!/bin/bash #********************* #Author: 流星花雨 #QQ: 1679338722 #Date: 2019-10-31 #FileName: for19.sh #URL: https://www.leitiancheng.cn #Description: The test script #********************* read -p "请输入用户名: " Action if [ -z $Action ];then echo "请不要输入空值" exit elif [[ ! "$Action" =~ ^[a-Z]+$ ]];then echo "请输入以字母开头的 [ a-Z ]" exit elif [ ${#Action} -ge 6 ];then echo "用户名长度不能超过6位" exit fi read -p "请输入创建的随机密码位数 " Num if [ $Num -lt 8 ];then echo 随机密码长度至少8位 exit fi for i in {1..10} do Pass=$(mkpasswd -l 8 ) id $Action$i >/dev/null if [ $? -ne 0 ];then useradd $Action$i echo $Action$i 创建成功 echo $Pass |passwd --stdin $Action$i >/dev/null echo $Action$i:$Pass >>ltc.txt else echo "$Action$i 用户已存在" continue fi echo 1 done
需求12:使用case实现批量删除用户。
[root@manager-61 ~/for]#cat for21.sh #!/bin/bash #********************* #Author: 流星花雨 #QQ: 1679338722 #Date: 2019-10-31 #FileName: for21.sh #URL: https://www.leitiancheng.cn #Description: The test script #********************* read -p "请输入要删除用户名前缀 " Action awk -F ":" '{print $1}' /etc/passwd | grep $Action > userdel.txt for i in $(cat userdel.txt ) do userdel -r $i done
1.提示用户输入需要删除的用户以及删除的个数。 2.如果用户存在则删除,如果不存在则提示no such user。
[root@manager for]# cat for-18.sh #!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-11-01 # FileName: for-18.sh # URL: https://www.xuliangwei.com # Description: read -p "请输入删除的用户: " qz read -p "请输入删除的个数: " hz read -p "是否要删除: [ y | n ]" Action case $Action in y) for user in $(seq $hz) do username=$qz$user id $username &>/dev/null if [ $? -eq 0 ];then userdel -r $username echo "$username is delete....." else echo "$username no such user ....." continue fi done ;; n) exit ;; *) exit esac
需求13:查看当前系统已使用内存的百分比,如果以使用的内存占比超过50%则将后台运行的服务列出来,并让用户选择保持不变或者关掉某个服务,后再次显示使用内存的百分比,若还超过50%,则重复上述操作
[root@manager-61 ~/for]#cat for23.sh #!/bin/bash #********************* #Author: 流星花雨 #QQ: 1679338722 #Date: 2019-11-01 #FileName: for23.sh #URL: https://www.leitiancheng.cn #Description: The test script #********************* a=$(free -m |awk '/Mem:/ {print $3/$2*100}') while [ ${a%.*} -gt 10 ] do clear echo "当前内存使用率为 $a %已超过80%" read -p "是否选择关闭一个服务 [ y | n ]" i case $i in y) pidstat esac done
需求14:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。
1.如何拿到所有的库名称 wordpress jpress zabbix zrlog
2.拿到后一个一个备份
[root@db01 ~]# cat for-mysql.sh #!/usr/bin/bash db_path=/backup/mysql date_time=$(date +%F) db_name=$(mysql -uroot -e "show databases;" |sed 1d|egrep -v "*_schema|mysql|test") [ -d $db_path ] || mkdir $db_path -p for i in $db_name do mysqldump -uroot -B ${i} >$db_path/${i}_${date_time}.sql if [ -f $db_path/${i}_${date_time}.sql ];then echo "$i backup is done....." else echo "$i backup is error...." fi done #保留最近180天的数据 find $db_path -type f -mtime +180 -delete | xargs rm -rf
需求15:使用for嵌套循环实现分库分表备份。
[root@db01 ~]# cat for-mysql-tables.sh #!/usr/bin/bash db_path=/backup/mysql date_time=$(date +%F) db_name=$(mysql -uroot -e "show databases;" |sed 1d|egrep -v "*_schema|mysql|test") #准备备份的目录 [ -d $db_path ] || mkdir $db_path -p #1.获取所有的库名称 for i in $db_name do #1.获取对应库的所有表 db_table=$(mysql -uroot -e "use $i; show tables;"|sed 1d) for j in $db_table do [ -d $db_path/$i/$date_time ] || mkdir $db_path/$i/$date_time -p mysqldump -uroot $i $j >$db_path/$i/$date_time/${j}.sql done done
需求16:编写一个上课随机点名脚本。
[root@manager-61 ~/for]#cat for20.sh #!/bin/bash #********************* #Author: 流星花雨 #QQ: 1679338722 #Date: 2019-10-31 #FileName: for20.sh #URL: https://www.leitiancheng.cn #Description: The test script #********************* if [ -s Name.txt ];then User=$(sort --random-sort Name.txt |awk 'NR==1') echo $User grep $User Name.txt >>Name1.txt grep -v $User Name.txt >Name.t cat Name.t >Name.txt else cat Name1.txt >Name.txt rm -rf Name1.txt fi
[root@manager for]# cat for-20.sh #!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-11-01 # FileName: for-20.sh # URL: https://www.xuliangwei.com # Description: if [ -s name.txt ];then User=$(sort --random-sort name.txt |awk 'NR==1') echo "$User" grep $User name.txt >> name1.txt sed -i '/'$User'/d' name.txt else cat name1.txt>name.txt rm -rf name1.txt fi
[root@manager for]# cat for-23.sh #!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-11-01 # FileName: for-23.sh # URL: https://www.xuliangwei.com # Description: #1.只循环20次 for i in {1..20} do #统计一下名单中的行号 line=$(cat name.txt|wc -l) #设定一个随机的变量值,但这个值不能超过文件名单的行号 sj=$(( ${RANDOM}%$line+1 )) # 循环20次,打印20次名单 echo -e " $(sed -n "${sj}p" name.txt) " sleep 0.1 done sj=$(( $sj + 1 )) username=$(sed -n "${sj}p" name.txt) echo -e 这次回答问题的是: "\033[32m $username \033[0m" 同学。
需求16:抓取https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/页面中的所有rpm包至本地
[root@manager for]# cat for-24.sh #!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-11-01 # FileName: for-24.sh # URL: https://www.xuliangwei.com # Description: # #1.获取网页的源代码 #2.对网页源代码进行过滤筛选,提取文件名称 #3.将下载的url和文件名称拼接,通过wget下载 Url_File=url.txt Pkg_Name=$(grep "<a href=" $Url_File | awk -F '"' '{print $2}' | egrep -v "debuginfo|repodata|\.\./") Get_Url=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/ for package in $Pkg_Name do #完整的下载url地址 url_package=$Get_Url$package #指定下载至某个目录 wget -O /mnt/$package $url_package &>/dev/null #判断下载是否正常 if [ $? -eq 0 ];then echo "软件包: $pkg is ok..." fi done
需求17: 写一个倒计时脚本.
#!/bin/bash # Author: Oldux.com QQ: 552408925 # Date: 2019-10-31 # FileName: for-16.sh # URL: https://www.xuliangwei.com # Description: for i in {9..1} do echo -n -e "$i\b" sleep 1 done
- 点赞
- 收藏
- 分享
- 文章举报
- Crazy Learning for Day 18
- day60-day-shell-while
- Shell API SHBrowseForFolder的用法
- Shell中关于if,case,for,while等的总结
- Shell中的循环语句for、while、until实例讲解
- set timeout for a shell command in python
- [9-13]Shell系列4――循环结构for、while、until及跳出循环
- shell之for循环的3个简单脚本
- shell的for循环
- shell之循环 (for、while、until)
- Linux Shell for循环写法总结
- Tips for a More Productive Day
- Shell 学习(七、循环语句的学习(for和while))
- linux自学_shell脚本for详解
- shell中的for循环
- SHELL 循环获取日期以及FOR使用
- 对Linux下shell编程之for循环的实例讲解
- github for window 中 git shell 设置代理方法和解决ssl证书错误的问题
- 嵌入式 shell 学习之for语句
- shell中的for循环用法