博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

shell 脚本——第五节课 交互输入read与for语句

交互输入与for语句

一、交互输入read

  read input()

  read 命令同可以定义多个变量值;而输入的内容默认以空格为分隔符,将值输入到对应的变量中;
  如果默认值过多,最后所有的值都会被赋予给最后一个变量;
  如果默认值过少,多余的变量则为空值;

  示例:
    read a b c
    aa bb cc

  read如何输入:
    echo "请输入一个目录:"
    我们需要echo -n 取消换行符号
    echo "请输入一个目录:";read变量
    请输入一个目录:\etc

    常用参数:
      -p
      read -p "请输入一个目录:"变量
      -t 定义超时时间
      read -t 5 -p "请输入一个目录:"变量

      

 

  练习题:输入一个设备文件,输出这个设备文件的基本信息;
  #!/bin/bash
  #
  read -t 5 -p "输入一个设备文件名:" devname
  [-z $devnaem] && devname= `fdisk -l`

  if [-b $devname];then
    fdisk -l $devname
    exit ()
  else
    echo"$devname 不是设备文件"
    echo"Usage:"
  fi

 

二、for语句循环

  回顾:文件判断脚本;
  #!/bin/bash
  #
  read -p "输入一个文件名:"name
  if[-z $name];then
    echo "Usage:'输入一个文件名:/etc/fstab'"
    exit 1
  fi

  if[! -e $name];then
    echo"提示:输入的文件不存在!!fool"
  exit 2
  elif[-f $name];then
    echo"$name is a file"
  elif[-d $name];then
    echo"$name is a dir"
  elif[-b $name];then
    echo"$name is a block file"
  elif[-L $name];then
    echo"$name is a Link file"
  else
    echo"$name是其他文件类型"

 

  case语句
    case语句的语法格式:
    case变量in
    PATTEN1)
      代码块1
      ;;
    PATTEN2)
      代码块2
      ;;
    *)
      代码库
    esac
--------------------------------------------------
  for语句的应用场景:
    有一个功能,这个功能需要循环执行,知识执行对象不同;【对象必须是同类数据】
  for 语句格式:
    a=['a','b','c'] --在python程序中,我们很多情况下,需要调用相应的方法去生成列表;
    for变量in列表:do
      循环体
    done
  99乘法表:
    {1..9}
    #!/bin/bash
    #
    for i in `seq 9`;do
      for j in `seq 9`;do
        [$j -le $i] && echo -n -e "$i*$j=`echo $(($i*$j))`\t"
      done
      echo " "
    done

    #!/bin/bash
    #99乘法表
    for i in {1..9};do
      for j in $1;do
        echo -n -e "$j*$i=$[$i*$j]\t"
      done
      echo
    done


  echo -e
    -e:使echo命令,能够识别 特殊字符;
    \r:回车不换行
    \n:换行符
    \t:制表符 tab = 4个空格

  unix2dos \r\n-->\n
  dos2unix


  列表生成方式:
  1、直接给出字符串列表
  for i in a b c d e ;do
    循环体
  done
  2、整数列表
    a{start...end} //{1..1}是不行的 {1..9} == python range{1,100}
    b seq 命令引用 $(seq [start[step]] end)
      步长 python range{1,100,2}
      seq 20 30

    题目:写一个for循环--遍历
    #!/bin/bash
    #ping遍历
    declare -i sum=0

    for i in $(seq 1 254);do

      ping -c l -w 1 10.6.12.$i &> /dev/null
      if [$? -eq];then
        let sum++
        echo "10.6.12.$i 是通的"
      fi
    done
    echo "总共有$sum 台电脑在线"


    题目:1到100的偶数和
    #!/bin/bash
    #偶数和


    declare -i sum=0

    for i in $(seq 0 100 2);do
      let sum+=$i
    done

    echo "总数为:$sum"

 

 

 

  3、返回列表的命令
    $(COMMAND)
    应用场景:ls /var/log/


    题目:判断/var/log的所有文件,以.log结尾的文件统计处理,并显示:
    #!/bin/bash
    #
    declare -i sum=0

    for i in $(ls /var/log/);do
      if["*.log" = $i];then
        echo$i
        let sum++
      fi
    done

    echo "统计.log结尾的文件有: $sum"

 

    题目:netstar -tan 查看网络状态,统计LISTEN 出现的状态次数、ESTABLISHED出现的状态次数、出现的状态次数
    #!/bin/bash
    #统计

    declare -i L=0
    declare -i E=0
    declare -i O=0

    for i in $(netstat -tna | grep "^tcp" | awk '{print $6}');do
      if [$i = LISTEN ];then
        let L++

      elif [$i = ESTABLISHED ];then
        let E++

      else
        let O++

      fi
    done
    echo "监听的链接有:$L"
    echo "其他链接:$E"
    echo "建立的链接有:$O"

    vim 常见用法:
      命令模式:
        dd 剪切
        5dd
        p 粘贴
        yy 粘贴
        5yy

 

  4、glob机制 -- 文件名通配符的机制
    $(ls /var/log/)

    /var/log/*.log

    test命令总结:
      1、test的命令的option的 -a -o 只在命令中使用;
        例如 [ `du -h $filename | cut -d: -f1`-lt 100k -a -x $filename]
          test `du -h $filename | cut -d: -f1`-lt 100k -a -x $filename
        注意:做字符串匹配的时候,不支持正则以及通配符

      2、test test ==[[ ]]
        再连接两个test的命令的时候,不能使用命令内部option -o -a
        一般使用 || && == != >= <=
        [[yum.log == *.log]]

 


    5、变量引用
      $@ $* 将参数做为for循环的列表
      $0 -- 和 awk 不一样
        bash中$0代表运行的脚本文件;
        awk中$0      --- awk 按行执行


      需要多个词的时候用"$@",需要一个词的时候用"$*"

 

 

 

 

 

 

 

 

posted @ 2019-08-15 19:31  MurkyCorners  阅读(385)  评论(0编辑  收藏  举报