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

shell脚本之for循环

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-8-19 15:07:45 | 显示全部楼层 |阅读模式
  bash的for循环:
  事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕;
  用法格式:
  for VAR_NAME in 元素1 元素2 ...; do
  语句1;
  语句2;
  ...
  done
  #!/bin/bash
  #
  for UserName in user1 user2 user3; do
  useradd $UserName
  echo $UserName | passwd --stdin $UserName
  done
  练习1:写一个脚本,显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行;
  for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do
  wc -l $FileName
  done
  练习2:写一个脚本
  使用for循环创建目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,并将它们的权限均修改为750;
  #!/bin/bash
  for DirName in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do
  mkdir $DirName
  chmod 750 $DirName
  done
  练习3:写一个脚本
  使用for循环修改目录/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改时间为2010年3月3号3点3分3秒;
  touch命令:
  touch FILE
  -a FILE
  -m FILE
  -t STAMP, [CC]YYMMDDhhmm.ss
  touch -m -t 201003030303.03 /tmp/1.dir
  #!/bin/bash
  for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do
  touch -m -t 201003030303.03 $Dir
  done
  for Dir in 1.dir 2.dir 3.dir; do
  touch -m -t 201003030303.03 /tmp/$Dir
  done
  练习4:写一个脚本
  使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数;
  #!/bin/bash
  for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
  grep "^#" $File | wc -l
  done
  #!/bin/bash
  for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
  LINES=`grep "^#" $File | wc -l`
  echo "$File: $LINES"
  done
  #!/bin/bash
  for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
  echo "$File: `grep "^#" $File | wc -l`"
  done
  练习5:写一个脚本
  使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数;
  #!/bin/bash
  for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
  echo "$File:"
  echo -e "\t#lines: `grep "^#" $File | wc -l`"
  echo -e "\tspace lines: `grep "^$" $File | wc -l`"
  done
  练习6:写一个脚本
  使用for循环分别将/proc/cpuinfo、/proc/meminfo、/proc/uptime三个文件中的所有小写字符显示为大写;
  #!/bin/bash
  for File in /proc/cpuinfo /proc/meminfo /proc/uptime; do
  tr 'a-z' 'A-Z' < $File
  done
  练习7:写一个脚本
  使用for循环显示用户user1、user2和user3各自的id号;
  #!/bin/bash
  for I in 1 2 3; do

  >  done
  #!/bin/bash
  for I in 1 2 3; do
  echo "user$I: `id -u user$I`"
  done
  练习8:写一个脚本
  使用for循环分别统计/usr、/var、/bin、/sbin目录下各自的文件个数;
  #!/bin/bash
  for Dir in /usr /var /bin /sbin;do
  ls $Dir | wc -l
  done
  练习9:写一个脚本
  使用for循环,分别将user1、user2和user3加入到testgrp组中,以其为额外组;
  #!/bin/bash
  groupadd testgrp
  for User in user1 user2 user3; do
  usermod -a -G testgrp $User
  done
  练习10:写一个脚本
  使用for循环,将“Hello Linux.”,“Hello www.magedu.com”, “GNU is Not Unix.”三行内容添加至/tmp/test.txt文件;
  添加完成后,显示/tmp/test.txt文件的内容;
  #!/bin/bash
  for Line in "Hello Linux" "Hello www.magedu.com" "GNU is Not Unix"; do
  echo $Line >> /tmp/test.txt
  done
  cat /tmp/test.txt
  练习11:写一个脚本
  使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15;
  #!/bin/bash
  for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do
  cp $File /tmp/$File-`date +%F`
  done
  /etc/fstab /etc/inittab
  #!/bin/bash
  for File in fstab inittab; do
  cp /etc/$File /tmp/$File-`date +%F`
  done
  练习12:写一个脚本
  显示当前系统上所有默认shell为/bin/bash的用户名、ID号及其在/etc/passwd文件中的行号;
  练习13:写一个脚本
  显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和shell;
  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 is $Uid, Shell: $shell"
  done
  练习14:写一个脚本
  显示/etc/passwd文件中第1、3、6、12个用户的用户名、ID和基本组的组名;
  #!/bin/bash
  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
  for 变量 in 列表; do
  语句1
  语句2
  ...
  done
  列表的生成:
  1、逐个给出,如:/etc/inittab /etc/fstab;
  2、使用通配符实现文件通配,例如for File in /var/*;
  3、使用命令生成列表:见下面的例子
  #!/bin/bash
  for File in `ls /var`; do
  file /var/$File
  done
  4、生成数字序列:
  {}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;
  `seq [起始数字] [步长] 结束数字`:
  练习:写一个脚本
  使用for循环取出每个用户用户名和Shell;
  #!/bin/bash
  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
  如何在shell脚本中进行算术运算:
  shell不支持浮点数;计算结果中的浮点数会被圆整为整数;1.23, 1; 1.99=1;
  +, -, *, /,
  算术运算的实现方式:假设A=5,B=9
  $[expression]:例如$[$A+$B]
  $((expression)): 例如$(($A+$B))
  let expression: 例如 let E=$A+$B
  expr expression: F=`expr $A + $B`
  练习:写一个脚本,
  随意声明两个变量,并给出整数值,而后计算它们的加、减、乘、除;
  练习:写一个脚本
  显示/var/目录下每个文件的内容类型,并统计文件的总数;
  #!/bin/bash
  #
  Count=0
  for File in /var/*; do
  file $File
  Count=$[$Count+1]
  done
  echo "Total files: $Count."
  练习:写一个脚本,计算100以内所有整数的和;
  #!/bin/bash
  #
  Sum=0
  for I in {1..100}; do
  Sum=$[$Sum+$I]
  done
  echo "The sum is: $Sum."
  练习:写一个脚本,计算100以内,所有偶数的和,以及所有奇数的和;
  #!/bin/bash
  EvenSum=0
  OddSum=0
  for I in `seq 12 100`;do
  OddSum=$[$OddSum+$I]
  done
  for I in `seq 22 100`;do
  EvenSum=$[$EvenSum+$I]
  done
  echo "Even Sum:$EvenSum; Odd Sum: $OddSum."
  练习:写一个脚本,计算当前系统上所有用户的ID号之和;
  #!/bin/bash
  IDSum=0
  for I in `cut -d: -f3 /etc/passwd`; do

  >  done
  echo "ID sum is: $IDSum."


运维网声明 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.iyunv.com/thread-553957-1-1.html 上篇帖子: Ubuntu命令行shell显示中文 下篇帖子: shell整理(28)===找规律写shell-IT生活
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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