设为首页 收藏本站
查看: 2469|回复: 0

[经验分享] bash循环控制语句之for循环

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-3-31 07:59:38 | 显示全部楼层 |阅读模式
一、for循环的语法
  for 变量 in 列表; do
      循环语句1
      循环语句2
      循环语句3
      ……
  done
  
  二、用法
  用变量去遍历列表,没访问列表中的一个元素就执行一次循环语句,直至列表中元素访问完。
  为了熟悉for循环语法的使用,照搬了课程中的练习题,顺便加深对其他基础命令的印象。
  
  练习1:使用for循环创建目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,并将它们的权限均修改为750;
  ?
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Date: 2015-03-26
# Author: ArvinLau
# Description:
# Version: 1.0
for FileName in /tmp/{1,2,3}.dir; do
  mkdir $FileName
  chmod 750 $FileName
done




练习2:显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do
    wc -l $FileName    #wc -l 查看文件内容行数
done




练习3:使用for循环修改目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改时间为2010年3月3号3点3分3秒
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for DirName in 1.dir 2.dir 3.dir;do
    touch -m -t 201003030303.03 /tmp/$DirName    #修改文件的修改时间touch -m -t
done




练习4:使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数
?
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for FileName in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do
    LINES=`grep "^#" $FileName | wc -l`
    echo "$FileName:$LINES"
done




练习5:使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数
?
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for FileName in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab;do
    echo "$FileName:"
    echo -e "\t#LINES:`grep "^#" $FileName | wc -l`"   
    echo -e "\tSpace LINES:`grep "^$" $FileName | wc -l`"



?
1
2
    #echo -e 与引号内的 \t 实现转义序列,可用于制表,下图中行前的空白部分即是实现效果
done



wKiom1UZZY2SlqVrAABqCfpU0jQ220.jpg

练习6:使用for循环分别将/proc/cpuinfo、/proc/meminfo、/proc/uptime三个文件中的所有小写字符显示为大写
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for FileName in cpuinfo meminfo uptime;do
    tr 'a-z' 'A-Z' < /proc/$FileName
done




练习7:使用for循环显示用户user1、user2和user3各自的id号
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for User in user1 user2 user3;do
    echo "$User:`id -u $User`"
done



或者
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for I in 1 2 3;do
    echo "user$I:`id -u user$I`"
done




练习8:使用for循环分别统计/usr、/var、/bin、/sbin目录下各自的文件个数
?
1
2
3
4
5
6
7
8
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for Dir in /usr /var /bin /sbin;do
    ls $Dir | wc -l
done




练习9:使用for循环,分别将user1、user2和user3加入到testgrp组中,以其为额外组
?
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
groupadd testgrp
for I in 1 2 3;do
    usermod -a -G testgrp user$I    #-a参数意为追加,不加则为修改
done



练习10:使用for循环,将“Hello Linux.”,“Hello www.magedu.com”, “GNU is Not Unix.”三行内容添加至/tmp/test.txt文件,并显示/tmp/test.txt文件的内容?
1
2
3
4
5
6
7
8
9
!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for Contents in "Hello Linux" "Hello www.magedu.com" "GNU is Not Unix";do
    echo $Contents >> /tmp/text.txt    #>> 追加输入重定向
done
cat /tmp/text.txt



练习11:使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15?
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions;do

    FileName=`basename $File`    #此处取基名

    cp $File /tmp/$FileName-`date +%F`    #注意date后的空格

done




练习12:显示当前系统上所有默认shell为/bin/bash的用户名、ID号及其在/etc/passwd文件中的行号
?
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for Bash in `grep -n "/bin/bash" /etc/passwd`;do

    echo $Bash >> /tmp/bash_user_id_lines.txt    #这里将变量内容写进了临时文件中

done
cut -d: -f1,2,4 /tmp/bash_user_id_lines.txt
rm /tmp/bash_user_id_lines.txt



或者

练习13:显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell
?
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for Line in 1 3 6 12;do
    UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
    Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`
    Shell=`head -$Line /etc/passwd | tail -1 | cut -d: -f7`
    echo "User:$UserName,UID:$Uid,SHELL:$Shell"
done




练习14:显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名
?
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
for Line in 1 3 6 12; do
    UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`
    Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`
    GroupName=`id -gn $UserName`
    echo "$UserName, $Uid, $GroupName"
done




=============================================
列表的生成
    1、逐个给出,如:/etc/inittab /etc/fstab;   
    2、使用通配符实现文件通配,例如for File in /var/*;   
    3、使用命令生成列表:见下面的例子
    for File in `ls /var`;
生成数字序列:
    {}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;   
    `seq [起始数字] [步长] 结束数字`:
练习15:使用for循环取出每个用户用户名和Shell  

?
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
LINES=`wc -l /etc/passwd | cut -d' ' -f1`
for I in `seq 1 $LINES`;do
    head -$I /etc/passwd | tail -1 | cut -d: -f1,7
done




练习16:显示/var/目录下每个文件的内容类型,并统计文件的总数
?
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
Count=0
for File in /var/*;do
    file $File
    Count=$[$Count+1]
    echo "Total files:$Count."
done



练习17:写一个脚本,计算100以内所有整数的和
?
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
Sum=0
for I in `seq 1 100`;do
    Sum=$[$Sum+$I]
done
echo "Sum:$Sum."



?
1




?
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
Sum=0
for I in {1..100}; do
    Sum=$[$Sum+$I]
done
echo "The sum is: $Sum."




练习18:写一个脚本,计算100以内,所有偶数的和,以及所有奇数的和
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
EvenSum=0
OddSum=0
for I in `seq 1 2 100`;do
    OddSum=$[$OddSum+$I]
done
for I in `seq 2 2 100`;do
    EvenSum=$[$EvenSum+$I]
done
echo "EvenSum is $EvenSum,OddSum is $OddSum."



?
1




练习19:写一个脚本,计算当前系统上所有用户的ID号之和
?
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# Date: 2015-03-30
# Author: ArvinLau
# Description:
# Version: 1.0
Sum=0
for I in `cut -d: -f3 /etc/passwd`;do
    Sum=$[$Sum+$I]
done
echo "ID Sum is:$Sum."



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-52316-1-1.html 上篇帖子: 监控http进程所占内存过高重启httpd 下篇帖子: 正则表达式和grep文本搜索工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表