blovekyo 发表于 2018-8-21 13:41:28

Shell常用语句应用示例

  Shell常用语句应用示例
  if语句应用示例
  例 8.13 检查"/var/log/messages" 文件是否存在,若存在则统计文件内容的行数并输出,否则不做任何操作(合理使用变量,可以提高编写效率)
  # vi chklog.sh
  #!/bin/bash
  LogFile="/var/log/messages"
  if [ -f $LogFile ] ; then
  wc -l $LogFile
  fi
  # sh chklog.sh      ///执行该脚本进行测试(sh是bash的符号链接)
  2102/var/log/messages
  例 8.14 提示用户指定备份目录的路径,若目录已经存在则显示提示信息后跳过,否则显示相应提示信息后创建该目录。
  # vi mkbak.sh
  #!/bin/bash
  read -p "what is your backup directory:" BakDir
  if [ -d $BakDir ] ; then
  echo "$BakDir already exist."
  else
  echo "$BakDir is not exist, will make it."
  mkdir $BakDir
  fi
  例 8.15 统计当前登录到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登录的用户账号名称及所在终端。
  # vi chkuser.sh
  #!/bin/bash
  UsersNum=`who |wc -l`
  if [ $UsersNum -gt 3 ] ; then
  echo "Alert, too many login users (Total: $UsersNum)"
  else
  echo "Login users:"
  who |awk '{print $1,$2}'
  fi
  例 8.16 检查portmap进程是否已经存在,若已经存在则输出“portmap service is running.”;否则检查是否存在“/etc/rc.d/portmap”可执行脚本,
  存在则启动portmap服务,否则提示“no portmap script file.”
  # vi chkportmap.sh
  #!/bin/bash
  pgrep portmap &> /dev/null
  if [ $? -eq 0 ] ; then
  echo "portmap service is running."
  elif [ -x "/etc/rc.d/portmap" ] ; then
  service portmap start
  else
  echo "no portmap script file."
  fi
  例 8.17 每隔五分钟监测一次mysqld服务进程的运行状态,若发现mysqld进程已终止,则在“/var/log/messages”文件中追加写入日志信息(包括当时时间),
  并重启mysqld服务;否则不进行任何操作。
  # vi chkdbsvr.sh
  #!/bin/bash
  service mysqld status & > /dev/null//通过service工具检查系统服务状态
  if [ $? -ne 0 ] ; then
  echo "At time: 'date': MySQL Server is down." >> /var/log/messages
  service mysqld restart
  fi
  # crontab -e
  */5 * * * * /root/chkdbsvr.sh
  for语句应用示例
  例 8.18 依次输出三条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串。
  # vi showday.sh
  #!/bin/bash
  for TM in "Morning" "Noon" "Evening"
  do
  echo "The $TM of the day."
  done
  例 8.19 对于使用“/bin/bash”作为登录Shell的系统用户,检查他们在“/opt”目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户账号。
  # vi chkfileown.sh
  #!/bin/bash
  DIR="/opt"
  LMT=100
  ValidUsers=`grep "/bin/bash" /etc/passwd |cut -d ":" -f 1`
  for UserName in $ValidUsers
  do
  Num=`find $DIR -user $UserName |wc -l`
  if [ $Num -gt $LMT ] ; then
  echo "$UserName have $Num files."
  fi
  done
  例 8.20 计算“/etc”目录中所有“*.conf”形式的配置文件所占用的总空间大小。
  #vi confsize.sh
  #!/bin/bash
  SizeNums=$(ls -l $(find /etc -type -f -a -name *.conf) | awk '{print $5}')   //提取各文件的大小值
  Total=0
  for i in $SizeNums
  do
  Total=`expr $Total + $i`       //计算每个文件的大小之和
  done

  echo "Total>  while语句应用示例
  例 8.21 由用户从键盘输入一个大于1的整数(如50),并计算从1到该数之间各整数的和。
  # vi sumint.sh
  #!/bin/bash
  read -p "Input a number (>1):" UP
  i=1
  Sum=0
  while [ $i -le $UP ]
  do
  Sum=`expr $Sum + $i`
  i=`expr $i + 1`
  done
  echo "The sum of 1-$UP is : $Sum"
  例 8.22 批量添加20个系统用户账号,用户名依次为“stu1”、“stu2”、“stu3”、..............、“stu20”,各用户的初始密码均为“123456”。
  # vi add20users.sh
  #!/bin/bash
  i=1
  while [ $i -le 20 ]
  do
  useradd stu$i
  echo "123456" |passwd --stdin stu$i & > /dev/null//为用户账号设置初始密码
  i=`expr $i + 1`       //将变量i递增1的操作可改用“let i++”的简略用法
  done
  例 8.23 编写一个批量删除用户的脚本程序,将上例中添加的20个用户删除。
  #vi del20users.sh
  #!/bin/bash
  i=1
  while [ $i -le 20 ]
  do
  userdel -r stu$i
  i=`expr $i + 1`
  done
  其他控制语句
  case语句应用示列:
  例 8.24 由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符,并输出相应的提示信息。
  # vi hitkey.sh
  #!/bin/bash
  read -p "Press some key, then press Return:" KEY
  case "$KEY" in
  |)
  echo "It's a letter."
  ;;
  )
  echo "It's a digit."
  ;;
  *)
  echo "It's function keys、Spacebar or other keys."
  esac
  until循环语句应用示例
  例 8.25 批量删除用户的脚本程序
  # vi del20users.sh
  #!/bin/bash
  i=1
  until [ $i -gt 20 ]
  do
  userdel -r stu$i
  i=`expr $i + 1`
  done
  shift语句应用示例
  例 8.26 编写一个Shell程序,计算多个整数值得和,需要计算的各个数值由用户在执行脚本时作为命令行参数给出。
  #vi sumer.sh
  #!/bin/bash
  Result=0
  while [ $# -gt 0 ]
  do
  Result=`expr $Result + $1`
  shift
  done
  echo "The sum is : $Result"
  break语句应用示例
  例 8.27 循环提示用户输入字符串,并将每次输入的内容保存到临时文件“/tmp/input.txt”中,当用户输入“END”字符串时退出循环体,并统计出input.txt文件中的行数、单词数、
  字节数等信息,统计完后删除临时文件。
  #vi inputbrk.sh
  #!/bin/bash
  while true
  do
  read -p "Input a string:" STR
  echo $STR >> /tmp/input.txt
  if [ "$STR" = "END" ] ; then   //建议为STR变量使用引号,以免字符串中有空格时出错
  break
  fi
  done
  wc /tmp/input.txt
  rm -rf /tmp/input.txt
  continue语句应用示例
  例 8.28 删除系统中的stu1-stu20各用户账号,但是stu8、stu18除外。
  #vi delsome.sh
  #!/bin/bash
  i=1
  while [ $i -le 20 ]
  do
  if [ $i -eq 8 ] || [$i -eq 18 ] ; then
  let i++
  continue
  fi
  userdel -r stu$i
  let i++
  done
  Shell函数的应用
  例 8.29 在脚本中定义一个help函数,当用户输入的脚本参数不是“start”或 “stop”时,加载该函数并给出关于命令用法的帮助信息,否则给出对应的提示信息。
  #vi helpfun.sh
  #!/bin/bash
  help() {
  echo "Usage: "$0" start|stop"
  }
  case "$1" in
  start)
  echo "Starting ..."
  ;;
  stop)
  echo "Shutdown ..."
  ;;
  *)
  help
  esac
  函数的参数传递
  例 8.30 在脚本中定义一个加法函数,用于计算两个数的和,并调用该函数分别计算12+34、56+789的和。
  #vi adderfun.sh
  #!/bin/bash
  adder() {
  echo `expr $1 + $2`
  }
  adder 12 34
  adder 56 789

页: [1]
查看完整版本: Shell常用语句应用示例