gteric 发表于 2018-8-29 13:33:00

linux学习笔记四(shell编程二)

  写一个脚本:
  计算100以内所有能被3整除的正整数的和;
  取模,取余:%
  3%2=1
  100%55=45
  #!/bin/bash
  let SUM=0
  for I in {1..100};do
  TMP=$[$I%3]
  if [ $TMP -eq 0 ];then
  SUM=$[$SUM+$I]
  fi
  done
  echo "SUM is $SUM"
  写一个脚本:
  计算100以内所有奇数的和以及所有偶数的和;分别显示之;
  写一个脚本:
  每5秒钟进行判断某用户是否登录。
  #!/bin/bash
  for I in `seq 100`;do
  w|grep "wuxiangd" &>/dev/null && echo "wuxiangdong is loggin in" || echo "wuxiangdong is not loggin in"
  sleep 5
  done         
  写一个脚本:
  启动服务的选项:只接受参数start,stop,restart,status其中之一
  #!/bin/bash
  if [ $# -lt 1 ];then
  echo "Usage: `basename $0` {start|stop|restart|status}"
  fi
  case $1 in
  -sta*)
  echo "service start"
  ;;
  -stop)
  echo "service stop"
  ;;
  -restart)
  echo "service restart"
  ;;
  -status)
  echo "service running"
  ;;
  *)
  echo "Unknow"
  exit 2
  ;;
  esac
  写一个脚本:
  判断10个随机数中,最大和最小的随机数,并且输出
  #!/bin/bash
  declare -i MIN=0
  declare -i MAX=0
  for I in {1..10};do
  MYRANDOM=$RANDOM
  [ $I -eq 1 ] && MIN=$MYRANDOM
  if [ $I -lt 10 ];then
  echo -n "$MYRANDOM ,"
  else
  echo "$MYRANDOM"
  fi
  if [ $MYRANDOM -gt $MAX ];then
  MAX=$MYRANDOM
  fi
  if [ $MYRANDOM -lt $MIN ] ;then
  MIN=$MYRANDOM
  fi
  done
  echo "The Max is $MAX"
  echo "The Min is $MIN"
  
  写一个脚本:
  通过选项-del -add -v等参数进行删除和增加用户。
  #!/bin/bash
  #
  DEBUG=0
  ADD=0
  DEL=0
  for I in `seq 0 $#`; do
  if [ $# -gt 0 ]; then
  case $1 in
  -v|--verbose)
  DEBUG=1
  shift ;;
  -h|--help)
  echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
  exit 0
  ;;
  --add)
  ADD=1
  ADDUSERS=$2
  shift 2
  ;;
  --del)
  DEL=1
  DELUSERS=$2
  shift 2
  ;;
  *)
  echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
  exit 7
  ;;
  esac
  fi
  done
  if [ $ADD -eq 1 ]; then
  for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do
  if>
  [ $DEBUG -eq 1 ] && echo "$USER exists."
  else
  useradd $USER
  [ $DEBUG -eq 1 ] && echo "Add user $USER finished."
  fi
  done
  fi
  if [ $DEL -eq 1 ]; then
  for USER in `echo $DELUSERS | sed 's@,@ @g'`; do
  if>
  userdel -r $USER
  [ $DEBUG -eq 1 ] && echo "Delete $USER finished."
  else
  [ $DEBUG -eq 1 ] && echo "$USER not exist."
  fi
  done
  fi
  练习:写一个脚本showlogged.sh,其用法格式为:
  showlogged.sh -v -c -h|--help
  其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;
  如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息;如
  Logged users: 4.
  They are:
  root   tty2         Feb 18 02:41
  root   pts/1      Mar8 08:36 (172.16.100.177)
  root   pts/5      Mar8 07:56 (172.16.100.177)
  hadoop   pts/6      Mar8 09:16 (172.16.100.177)
  #!/bin/bash
  #
  declare -i SHOWNUM=0
  declare -i SHOWUSERS=0
  for I in `seq 1 $#`; do
  if [ $# -gt 0 ]; then
  case $1 in
  -h|--help)
  echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
  exit 0 ;;
  -v|--verbose)
  let SHOWUSERS=1
  shift ;;
  -c|--count)
  let SHOWNUM=1
  shift ;;
  *)
  echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"
  exit 8 ;;
  esac
  fi
  done
  if [ $SHOWNUM -eq 1 ]; then
  echo "Logged users: `who | wc -l`."
  if [ $SHOWUSERS -eq 1 ]; then
  echo "They are:"
  who
  fi
  fi
  写个脚本,按如下方式执行:
  mkscript.sh -v|--version VERSION -a|--author AUTHOR -t|--time DATETIME -d|--description DESCRIPTION -f|--file /PATH/TO/FILE -h|--help
  1、此脚本能创建或打开-f选项指向的文件/PATH/TO/FILE;
  如果其为空文件,能自动为其生成第一行;
  如果文件不空,且第一行不是#!/bin/bash,则中止此脚本,并报错“The file is not a bash script.";
  否则,则直接使用vim 打开此文件;
  提示:/PATH/TO/FILE,要判断其目录是否存在;如果不存在,则报错;
  2、如果为空文件,自动生成的第一行内容为:
  #!/bin/bash
  3、如果为空文件,且使用了-a选项,则在文件中添加“# Author: -a选项的参数”,比如:
  # Author: Jerry
  4、如果为空文件,且使用了-t选项,则在文件中添加“# Date: 脚本执行-t选项后指定的时间”,比如:
  # Date: 2013-03-08 18:05
  5、如果为空文件,且使用了-d选项,则在文件中添加“# Description: -d选项的内容”,比如:
  # Description: Create a bash script file head.
  6、如果为空文件,且使用了-v选项,则在文件添加“# Version: -v后跟的参数”,比如:
  # Version: 0.1
  6、-h选项只能单独使用,用于显示使用帮助;
  7、其它选项,显示帮助信息;
  说明:
  这是一个用于创建脚本的脚本,它可以自动帮助创建一个bash脚本的文件头,这样,以后使用此脚本来创建其它脚本将变得比较高效。比如:
  #!/bin/bash
  # Author: Jerry(jerry@magedu.com)
  # Date: 2013-03-08 18:05
  # Description: Create a bash script file head.
  # Version: 0.1
  #
  实现:
  
  #!/bin/bash
  declare -i VERSION=0
  declare -i AUTHOR=0
  declare -i TIME=0
  declare -i DESCRIPTION=0
  declare -i FILE=0
  for I in `seq $#`;do
  -v|-version)
  VERSION=1
  MYVERSION=$2
  -a|--author)
  AUTHOR=1
  MYAUTHOR=$2
  shift 2
  ;;
  -t|-time)
  TIME=1
  MYTIME=$2
  shift 2
  ;;
  -d|--description)
  DESCRIPTION=1
  MYDESCRIPTION=$2
  shift 2
  ;;
  -f|--file)
  FILE=1
  MYFILE=$2
  shift 2
  ;;
  -h|-help)
  exit 0
  ;;
  *)
  esac
  fi
  done
  #######################################################################################
  if [ $FILE -eq 1 ];then
  if [ -e $MYFILE ];then
  MYHEAD=`head -1 $MYFILE`
  if [ "$MYHEAD" == "#!/bin/bash" ];then
  if [ $AUTHOR -eq 1 ];then
  echo "#Author:$MYAUTHOR">>$MYFILE
  fi
  if [ $TIME -eq 1 ];then
  echo "#Date:$MYTIME">>$MYFILE
  fi
  if [ $DESCRIPTION -eq 1 ];then
  echo "#Description:$MYDESCRIPTION">>$MYFILE
  fi
  if [ $VERSION -eq 1 ];then
  echo "#Version:$MYVERSION">>$MYFILE
  fi
  vim + $MYFILE
  exit 0
  else
  echo "The file $MYFILE is not a bash Script!"
  fi
  else
  touch $MYFILE
  echo "#!/bin/bash">>$MYFILE
  if [ $AUTHOR -eq 1 ];then
  echo "#Author:$MYAUTHOR">>$MYFILE
  fi
  if [ $TIME -eq 1 ];then
  echo "#Date:$MYTIME">>$MYFILE
  fi
  if [ $DESCRIPTION -eq 1 ];then
  echo "#Description:$MYDESCRIPTION">>$MYFILE
  fi
  if [ $VERSION -eq 1 ];then
  echo "#Version:$MYVERSION">>$MYFILE
  fi
  vim + $MYFILE
  exit 0
  fi
  fi
  写一个脚本:
  1、通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线,
  如果在线,就显示"ip is up.",其中的IP要换为真正的IP地址,且以绿色显示;
  如果不在线,就显示"ip is down.",其中的IP要换为真正的IP地址,且以红色显示;
  要求:分别使用while,until和for(两种形式)循环实现。
  ping
  -c(ping d的次数)
  -W (多长时间内有效)
  方法一:
  
  #!/bin/bash
  declare -i I=1
  while [ $I -le 100 ];do
  if ping -c 1 -W 2 10.25.84.$I &>/dev/null;then
  echo "10.25.84.$I is up"
  sleep 2
  else
  echo "10.25.84.$I is down"
  sleep 2
  fi
  let I+=1
  done
  方法二:
  #!/bin/bash
  declare -i I=1
  until [ $I -eq 100 ];do
  if ping -c 1 -w 1 10.25.84.$I &>/dev/null;then
  echo "10.25.84.$I is up"
  sleep 1
  else
  echo "10.25.84.$I is down"
  sleep 1
  fi
  let I+=1
  done
  方法三:
  #!/bin/bash
  for I in `seq 100`;do
  if ping -c 1 -W 1 10.25.84.$I &>/dev/null;then
  echo "10.25.84.$I is up"
  sleep 1
  else
  echo "10.25.84.$I is down"
  fi
  done
  方法四:
  #!/bin/bash
  for ((I=0;I/dev/null;then
  echo "10.25.84.$I is up"
  sleep 1
  else
  echo "10.25.84.$I is down"
  sleep 1
  fi
  done
  写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:
  1、列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本;如果用户选择错误,就让用户重新选择;
  2、当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,n就退出;否则,让用户重新选择;
  3、抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区);
  并为其创建三个主分区,第一个为20M,第二个为512M, 第三个为128M,且第三个为swap分区类型;
  (提示:将分区命令通过echo传送给fdisk即可实现)
  fdisk -l |grep "
  dd if=/dev/zero of=/dev/sdb bs=512 count=1
  sync
  sleep 3
  ###########################################################################################
  #!/bin/bash
  echo "This is all partion:"
  PARTITIONS=`fdisk -l 2>/dev/null |grep "^Disk /dev/d"|awk '{print $2}'|cut -d: -f1`
  echo "$PARTITIONS"
  echo -e "Plerse Input partion:\033
  read PART
  if [ $PART == 'quit' ];then
  exit 0
  fi
  until echo "$PARTITIONS" | grep "$PART" ;do
  read PART
  done
  echo -e "The partition will be formate:\033\033
  read SELECT
  if [ $SELECT == 'y' ];then
  dd if=/dev/zero of=$PART bs=512 count=1 &>/dev/null
  sync
  sleep 3
  echo "Format complete!"
  else
  exit 0
  fi
  echo -e "Do you want to make a partion?\033\033
  read SELECT1
  if [ $SELECT1 == 'y' ];then
  echo 'n
  p
  1
  +40M
  n
  p
  2
  +512M
  n
  p
  3
  +128M
  t
  3
  82
  w'|fdisk $PART &>/dev/null
  if [ $? -eq 0 ];then
  echo "Build successful!"
  fi
  else
  exit 0
  fi
  echo -e "Do you want to build file system?\033\033
  read SELECT2
  if [ $SELECT2 == 'y' ];then
  for I in `echo "$PARTITIONS"`;do
  mke2fs -j $I &>/dev/null
  done
  echo "build complete!"
  else
  exit 0
  fi
  fdisk -l
  
  
  写一个脚本,完成以下功能:
  说明:此脚本能于同一个repo文件中创建多个Yum源的指向;
  1、接受一个文件名做为参数,此文件存放至/etc/yum.repos.d目录中,且文件名以.repo为后缀;要求,此文件不能事先存,否则,报错;
  2、在脚本中,提醒用户输入repo>
  3、repo name以及baseurl的路径,而后以repo文件的格式将其保存至指定的文件中;
  4、enabled默认为1,而gpgcheck默认设定为0;
  5、此脚本会循环执行多次,除非用户为repo>
  
  ###########################################################################################
  #!/bin/bash
  CREATE=0
  if [ $# -gt 0 ];then
  case $1 in
  --help|-h)
  echo "Usage:`basename $0` {--help|-h }"
  exit 0;
  ;;
  -c|--create)
  CREATE=1;
  FILENAME=$2;
  ;;
  *)
  echo "Usage:`basename $0` {--help|-h }"
  exit 1;
  ;;
  esac
  fi
  if [ $CREATE -eq 1 ];then
  if [ -e /etc/yum.repos.d/${FILENAME}.repo ];then
  echo "$FILENAME exis!"
  exit 1;
  else
  >
  declare -i I=1
  while [ $ID != 'quit' ] && [ $ID != 'q' ] ;do
  touch /etc/yum.repos.d/${FILENAME}.repo
  echo "Create ${I}th"
  read -p "Please input>
  if [ $ID == 'quit' ] || [ $ID == 'q' ];then
  exit 0;
  else
  echo "[$ID]" >> /etc/yum.repos.d/${FILENAME}.repo
  fi
  read-p "Please input Name:" NAME
  echo "name=$NAME" >> /etc/yum.repos.d/${FILENAME}.repo
  read -p "Please input baseurl:" BASEURL
  echo "baseurl=$BASEURL" >> /etc/yum.repos.d/${FILENAME}.repo
  echo "enable=1" >> /etc/yum.repos.d/${FILENAME}.repo
  echo "gpgcheck=0" >> /etc/yum.repos.d/${FILENAME}.repo
  let I=$I+1
  echo $I
  done
  fi
  fi
  
  
  
  
  
  
  
  
  

页: [1]
查看完整版本: linux学习笔记四(shell编程二)