shell基本知识1

一、shell介绍
  通常所说的shell就是shell脚本,它是一门脚本语言,弱类型,在定义时不需要指定变量类型
二、shell规范
  1)第一行内容为#!/bin/bash,表示使用shell进行编程
  2)#:shell中的注释
  3)shell脚本是以.sh结尾的文件

三、语法

  1、变量

    1)定义变量格式

      变量名=变量值  #==两边没有空格

    2)变量命名规范

      由字母、数字、下划线组成,不能已数字开头

    3)输出和释放变量

      输出变量:echo $变量名

      释放变量:unset 变量名

    4)特殊变量,带有空格的

      双引号:如果变量值中存在$变量名(即变量)的话,那么输出结果将会是变量名对应的变量值,如果想原样输出,则可以在$变量名前加转义字符\

      单引号:不管内容如何都原样输出

      反单引号:专门用于存放命令

  2、read的用法

    1)方法1:read 变量名1 变量名2 。。。。

      说明:变量名可以1个或多个,多个时变量名之间用空格隔开,如果给出变量值多于变量名,则把多余出的变量值都赋给最后一个变量

    2)方法2:read -p '提示内容' 变量名1 变量名2 。。。。。

      说明:添加提示信息,便于方便知道需要输入什么参数 

  3、参数传递

    1)向.sh文件中传入数据

      格式:sh xw.sh /etc /root ...  命令 文件名 参数1 参数2 。。。

    2)文件内接收参数

      $1:第一个参数

      $2:第二个参数

      。

      。

      。

      $n:第n个参数

      $0:为文件名

      $@:所有参数

      $#:参数个数

  4、重定向

    说明:把命令的内容输出到文件中

    正确命令:由1表示

      覆盖:命令 1>文件名  例:ls 1>1.txt

      追加:命令 1>>文件名  例:ls 1>>1.txt

    错误命令:由2表示

      覆盖:命令 2>文件名  例:ls 2>1.txt

      追加:命令 2>>文件名  例:ls 2>>2.txt

  5、分支结构(if...else...)

    1)格式:

       if [ 条件 ];then

       语句

       else

       语句

       fi

    2)注意事项

      条件两边有空格隔开

      多个条件之间要有空格

      if后面要有空格

      条件中如果存在变量,则变量两边需要添加双引号

    3)案例  判断目录是否为空

       

  6、逻辑运算符

 

    1)说明:

 

      且:-a

 

      或:-o

 

      非:!

 

    2)案例:判断用户输入的用户名和密码是否为admin 123456,是则提示登录成功,否则提示登录失败

 

      

  7、比较运算

    1)说明:

      -eq:判断是否相等

      -gt:判断是否大于

      -ge:判断是否大于等于

      -lt:判断是否小于

      -le:判断是否小于等于

      -ne:判断是否不等于

    2)数字变量操作

      加1

        ((i++))  ((i+=1))  i=$[$i+1]  i=$(($i+1))  let i=i+1

      减1

        ((i--))  ((i-=1))  i=$[$i-1]  i=$(($i-1))  let i=i-1

      注:加减n,则把1变为n即可

    3)案例:输入数字,判断数字是否大于0,大于0则将该数字减1并输出,否则加1并输出

      

 

 

   8、判断目录、文件是否存在  

    1)test:

      test -e 文件名:表示文件是否存在

      test -f 文件名:表示文件是否存在且为文件

      test -d 文件名:表示文件是否存在且为目录

      test -r 文件名:可读

      test -x 文件名:可操作

      test -w 文件名:可写

    2)案例1:利用test判断文件

       

 

    3)if+参数

      说明:去掉test,但沿用参数

      格式:if [ -参数 ] 文件名

    4)案例2:直接利用if+参数判断文件

 

       

 

   注:也可以判断字符是否相等

    案例1:判断数字是否等于3

    

    案例2:判断字符是否相等

    

 

    案例3:循环ping网络ip+并发控制:循环ping192.168.10.6--192.168.10.10之间的ip通讯

    

    注:{程序}& 表示将程序放置在后台并行执行,如果需要等待执行完在进行下面动作,需要添加wait

   9、if...elif...else分支

    1)格式:

      if [ 条件1 ];then

 

 

        语句1

      elif [ 条件2 ];then

        语句2

      elif [ 条件3 ];then

        语句3

      。。。。。

      elif [ 条件n ];then

        语句n

      else

        语句

      fi

     2)案例:判断学生成绩,[90-100]提示优秀,[80-90)提示良好,[70-80)提示一般,[60-70)提示及格,其他不及格

        

  10、case分支

    1)格式:

      case $变量名 in

      "值1")

        语句1;;

      "值2")

        语句2;;

      ........

      *)

        语句n

      esac

    2)注意:

      ① case这一行最后必须是in

      ② ;;为结束语句

      ③ *默认

      ④ ‘值’可以是字符串也可以是数字

      ⑤ ‘值’也可以是范围

    3)案例1:循环输入一个字母,判断该用户选择的是哪款产品,A:电饭锅;B:洗衣机;C:捡肥皂,D的提示输入错误,结束循环,退出

       

    4)案例2:请输入对客服的满意度,【0-3】为不满意,【4-6】为满意,【7-9】为非常满意

    5)案例3:模拟一个多任务维护界面,当执行时先显示总菜单,然后选择后进行相应的操作

    #!/bin/bash

    cat <<-EOF                        //cat << -EOF  这里代表先输入,最后输入EOF为结束,最后一起把前面输入的数据一起显示出来

 

          *************请选择***************
          h       显示命令帮助
          f       显示磁盘分区
          d       显示磁盘挂载
          m       查看内存使用
          u       查看系统负载
          q       退出程序
          EOF
    while true
    do
    read -p "请输入你要的选择:" choice
    case $choice in
              h)
              cat<<-EOF
                h       显示命令帮助
                f       显示磁盘分区
                d       显示磁盘挂载
                m       查看内存使用
                u       查看系统负载
                q       退出程序
                EOF;;
                f)
                lsblk;;
                d)
                mount;;
                m)
                free -m;;
                u)
                uptime;;
                q)
                exit;;
    esac
    done    

 

  11、循环结构:for循环

    1)格式

        for 变量名 in 列表

        do

          语句

        done

    2)列表

      格式1:seq start size max

      格式2:{start..max..size}

      说明:

        start:开始点

        size:间隔,若为1则可省略不写

        max:结束点

    3)案例:输入1-10之间的奇数  (下图2和10之间的下划线是鼠标悬浮,此处是没有下划线的)

      

 

    4)案例:求1-100之间的和

    方法1:步进风格

      

 

    方法2:列表风格

      

    方法3:C类风格

       

 

12、循环结构:while循环

     1)格式

        while [ 条件 ]

        do

        命令

        done

     2)案例:求1到100之间的和

      

 

13、练习

  ##每隔30s同步一次时间,同步失败则发送邮件,同步成功100次也发送一次邮件

  思路:(1)30s同步一次时间,while死循环,while true 或者while [ 1 -eq 1]类似

     (2)同步失败发送一次邮件,同步时间:ntpdate 服务器ip 或者rdate -s 服务器ip

     (3)同步成功100次发送一次邮件,此处需要保存成功的次数,每隔成功100次都需要发送一次邮件,所以需要$[$count%100] -eq 0,若次数是100的倍数就发一次

  实现:

    

14、until循环

 

  特点:条件为假就进入循环,为真就退出循环

 

  格式:until [条件]

 

     do

 

      命令

 

     done

 

  案例:用until循环打印1-5

 

     

15、RANDOM  随机数

  (1)获取随机数:echo $RANDOM

  (2)获取0到n之间的随机数:echo $[$RANDOM%(n+1)]    //echo $[$RANDOM%5]:获取0-4之间的随机数

  (3)获取上一次获取的随机数:set | grep RANDOM

  案例1:一个脚本,产生一个文件phone.txt,随机产生以139开头的手机号10个,一个一行

    

 

  案例2:在案例1中的phone.txt中抽取5个幸运观众,显示出这5个幸运观众,但只显示号码的前三位和后四位,中间四位用*代替

      思路:(1)确定幸运观众行号:0-100,随机数字,$[$RANDOM%100+1]

         (2)提取电话号码:head -(1)中的随机数字 phone.txt | tail -1  即前几行中的最后一行内容

         (3)显示前三位和后四位电话号码:phone_num=13912345678 echo "139****${phone:7:4}", ${phone:7:4}代表phone中从第7位开始后面4位

    

 

 

16、shift  位移

  说明:使位置参数向左移动,默认移动一位,可以使用shift n 来移动n位

  案例1:for循环方法打印1-10之间的奇数和

  

 

  案例2:shift方法打印1-10之间奇数和

  

17、expect

  案例:从普通用户自动切换到root用户

  

 

 

   #执行shell脚本时不能直接用sh *.sh或者./*.sh,即使您在顶部指定了带有bang的环境,您仍然必须使用expect -f运行它。所以需要用expect -f ./*.sh

18、函数

    1)两种定义:

         函数名()

              {

              函数体(一堆命令的集合,实现一些功能)

              } 

         function 函数名()

              {

              函数体(一堆命令的集合,实现一些功能)

              }

    2)函数中return的运用说明

      #return可以结束一个函数,类似循环控制语句break(结束当前循环,执行循环体后面的代码)

      #return默认返回函数中最后一个命令状态值,也可以给定参数值,范围在0-256之间

      #如果没有return命令,函数将返回最后一个指令的退出状态值

    3)调用

      #必须先定义函数

      #两种调用方法:

        在当前命令行调用

        脚本中调用

    4)函数中的参数

      ①:使用$n来接收数据

    5)返回值

      ①:正确时返回0

      ②:错误时返回1

      ③:查看返回值内容:$?

    6)案例1:只打印hello,修改返回值为66

      

    7)案例2:输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,并判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件存在,删了跑路

      

    8)案例3:写一个脚本收集用户输入的基本信息(姓名、性别、年龄),如不输入则一直提示输入,最后根据用户的信息输出相对应的内容

      第一种写法:

      

      第二种写法:

 

      

 

      输出结果: 

 

 

       

 

posted on 2020-04-14 18:06  长征中的蜗牛  阅读(253)  评论(0编辑  收藏  举报