Shell循环语句

for循环语句

读取不同的变量值,用来逐个执行同一组命令

格式

for 变量名 in 取值列表
do
命令序列
done

使用规则

使用for循环语句时,需要指定一个变量及可能的取值列表, 针对每个不同的取值重复执行相同的命令序列,直到变量值使用完退出循环。在这里,“取值列表”称为 for 语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录,IP,黑名单)

项目示例

根据姓名列表创建账户

[root@server2 ~]# vim users.txt    创建用户列表
[root@server2 ~]# vim useradd.sh

#!/bin/bash
# 添加新用户
ulist=$(cat /root/users.txt)
for uname in $ulist
do 
  if [ $uname == `grep $uname /etc/passwd | awk -F: '{print $1}'`]
  then echo "姓名重复"
  fi
  useradd $uname
  echo "123456" | passwd -- stdin $uname &> /dev/null
done

[root@server2 ~]# chmod +x useradd.sh
[root@server2 ~]# ./useradd.sh

删除用户保留文件

[root@server2 ~]# vi user1.txt    创建要删除账户的列表
[root@server2 ~]# vim usrdel.sh

#!/bin/bash
# 删除用户及用户所在的宿主目录
ulist=$(cat /root/user1.txt)
for uname in $ulist
do
    a=`ls -lh /home/$uname | awk '{print $2}'`
    if [ "$a" != "0" ]
    then cp -r /home/$uname /userfile_backup
    fi
    userdel -r $uname &> /dev/null
done

[root@server2 ~]# mkdir /userfile_backup   创建用于备份删除账户的文件
[root@server2 ~]# chmod +x usrdel.sh 
[root@server2 ~]# ./usrdel.sh
[root@server2 ~]# id zhangsan    查看被删除用户是否还在
[root@server2 ~]# cd /userfile_backup/ 查看删除用户的用户文件是否还在
[root@server2 userfile_backup]# ls -lh

检查主机在线状态

[root@server2 ~]# vi ipadd.txt      创建检测主机地址

192.168.10.10
192.168.10.66
192.168.10.200

[root@server2 ~]# vim ip_test.sh

#!/bin/bash
# 测试主机是否在线
hlist=$(cat /root/ipadd.txt)
for ip in $hlist
do 
  ping -c 3 -i 0.2 -W3 $ip &> /dev/null      ping 地址
  if [ $? -eq 0 ]                             $?0,成立
  then echo "$ip is up."                  在线
  else echo "$ip is down."
  fi
done

[root@server2 ~]# chmod +x ip_test.sh
[root@server2 ~]# ./ip_test.sh

计算加班工资

[root@server2 ~]# vi jiaban.txt     创建加班名单
[root@server2 ~]# vim jiabanday.sh

#!/bin/bash
# 加班工资
base_money=5000
list=$(cat /root/jiaban.txt)
for user in $list
do 
    money=$(expr $base_money + 300)
    echo "$user salary is $money"
done

[root@server2 ~]# sh jiabanday.sh

[root@server2 ~]# vim jiabanall.sh

#!/bin/bash
# 加班工资
base_money=5000
for user in $1
do 
   money=$(expr $base_money + 300 \* $2)
   echo "$user salary is $money"
done

[root@server2 ~]# chmod +x jiabanall.sh
[root@server2 ~]# ./jiabanall.sh

while循环

重复测试某个条件,只要条件成立则反复执行

格式

while 条件测试操作
do
命令序列
done

对比for循环

for循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数,操作对象按数字顺序编号,按特定条件执行重复操作等情况,则更适合使用另外一种循环------while语句。

使用规则

可以根据特定的条件反复执行一个命令序列,直到该命令不再满足时为止,当测试条件不再成立,从而结束循环。

项目实例

添加多个新用户

[root@server2 ~]# vim use_while.sh

#!/bin/bash
i=1
while [ $i -le 20 ]
do
    user="stu$i"
    if [ $user == `grep $user /etc/passwd | awk -F: '{print $1}'` ]
    then echo "姓名重复"
    fi
    useradd $user
    echo "123456" | passwd --stdin $user &> /dev/null
    let i++
done

[root@server2 ~]# chmod +x use_while.sh
[root@server2 ~]# ./use_while.sh

删除用户

[root@server2 ~]# vim userdel_while.sh

#!/bin/bash
i=1
while [ $i -le 20 ]
do 
    uname="stu$i"
    a=`ls -lh /home/$uname | awk '{proint $2}'`
    if [ "$a" != "0" ]
    then cp -r /home/$uname /userfile_backup
    fi
    userdel -r $uname
    let i++
done

[root@server2 ~]# sh userdel_while.sh
[root@server2 ~]# tail /etc/passwd
[root@server2 ~]# tail -3 /etc/passwd

猜价格游戏

[root@server2 ~]# vim pricegame.sh

#!/bin/bash
# 竞猜价格
price=$(expr $RANDOM % 1000)
times=0
echo "商品实际价格范围为0-999,猜猜看是多少?"
while true
do
     read -p "请输入您竞猜的价格?" int
     let times++
     if [ $int -eq $price ]
     then echo “恭喜你猜对了,实际价格是$price”echo “你一共猜了$time次”;break
     elif [ $int -gt $price ]
     then echo “太高了”
     else
     echo “太低了”
     fi
done

[root@server2 ~]# chmod +x pricegame.sh
[root@server2 ~]# ./pricegame.sh

until循环

重复测试某个条件,只要条件不成立则反复执行

格式

until 条件测试操作
do
命令序列
done

对比while循环

until循环与while循环类型,while循环能实现的脚本until同样可以实现,但区别是while循环在条件为真时继续执行循环,而until则是在条件为假时执行循环。

项目示例

求和

[root@server2 ~]# vim sum_while.sh

#!/bin/bash
i=0
s=0
until [ $i -eq 50 ]
do 
     let i=$i+1
     let s=$s+$i
done
echo "1-50的和为:" $s

[root@server2 ~]# chmod +x sum_while.sh
[root@server2 ~]# ./sum_while.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值