我积极解决 发表于 2018-8-19 15:07:45

shell脚本之for循环

  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, 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
  $:例如$[$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]
查看完整版本: shell脚本之for循环