zoukankan      html  css  js  c++  java
  • Day 4 shell脚本

    2019-04-06   16:56:09

    涉及编程,if判断, 脚本传参,for , while循环等,不太会写。

    测试日常用的少,运维用得多。了解即可。

     一、    引用变量

             $name   或 $(name)

    二、    条件判断

             整数测试:

                   -gt  :是否大于  (条件成立则输出0 ,否则为1)

                   -ge  :是否大于等于

                    -lt:是否小于

                    -le:是否小于等于

                    -eq:是否等于

                    -ne:是否不等于

      

             文件测试:测试文件的存在性以及属性测试

               -e  $file:是否存在   eg#[-e /etc/文件名]  ,存在为真,否则为假

               -f  $file:文件是否为普通文件

               -d 文件是否为目录

               -h 是否存在且为符合链接文件 -----/dev

               -b 是否存在且为块设备文件   -----/dev

               -s 是否存在且为套接文件     -----/var/lib/mysql/mysql.sock

               -p 是否存在且为管道文件  

               -r 当前用户对文件是否有读权限

               -w 当前用户对文件是否有写权限

               -x 当前用户对文件是否有执行权限

               注意:所有指令前!,表示该指令的反向功能

               执行脚本的命令:bash   sh  ./

    三、if 语句  

    格式:单分支:

                    if 条件;then

                      分支

                    fi

               多分支:

                    if 条件;then

                      分支

                    else

                      分支

                    ....

                    fi

    eg1:用户不存在则创建用户

    username=lianyou

    if ! id $username &>/dev/null;then

         useradd $username

       echo 123456 |passwd --stdin $username

       echo "$username:创建成功"

    fi

    eg2:如果用户存在则显示该用户,否则创建该用户

    #!/bin/bash

    username=xiaotangtang

    if id $username &>/dev/null;then

       echo "$username:该用户已经存在"

    else

       useradd $username

       echo 123456 |passwd --stdin $username

       echo "$username:用户创建OK"

    fi

    练习3:如果某路径不存在(chenyan/kj/skjd/akdsjh),则将其创建为目录:否则显示其存在,并显示其类型(file指令获取文件类型)

    #!/bin/bash

    filename=/duoceshi19/a/b/c/d

    if [ -e $filename ];then

      echo "$filename:存在"

      file $filename            #file获取文件类型

    else

      mkdir -p $filename

      echo "$filename:创建成功"

    fi

    四、脚本传参

      ./file.sh  /etc/passwd    /etc/passwd  .......

         $0          $1                $2            $n

    eg4:判断脚本传入的第一个位置参数$1是否为文件,如果是文件则统计文件行数,否则显示文件不存在或不是一个文件

    #!/bin/bash

    if [ $# -lt 1 ];then

       echo "请传递一个参数"

       exit 1

    fi

    if [ -f $1 ];then

       nl $1

    else

     echo "你传入的是什么啊!!!"

    fi

    练习5:通过脚本参数传递一个文件路径给脚本,判断其类型?

    if [ $# -lt 1 ];then

       echo "必须给一个参数"

       exit 1

    fi

    if [ -f $1 ];then

      echo "这是个文件"

    elif [ -d $1 ];then

      echo "这是个目录"

    elif [ -h $1 ];then

      echo "这是个符号链接"

    elif [ -b $1 ];then

      echo "这是个块设备文件"

    else

      echo "输入的是啥啊!我不认识"

    fi

    除了脚本参数其次还可以用与用户交互的方式:

    例子6:讲解read命令,体现与用户交互(通过键盘输入一个用户)

           read命令:read 命令从标准输入中读取一行

    用户忘记输入一个用户,则给用户一个默认值,如果第二次不给值,则脚本将显示用户存在(第一次创建过);这时必须我们输入了个新用户;

    #!/bin/bash

    read -p "请输入一个用户:" -t 5 username

    if [ -z $username ];then

       username=uuuuu

    fi

    if id $username &>/dev/null;then

       echo "$username:存在"

    else

       useradd $username

       echo 123456 |passwd --stdin $username

       echo "$username:ok"

    fi

    练习7:写一脚本能接受任意输入两数进行大小比较?(考虑输入的两个数是相等的)

    #!/bin/bash

    read -p "请输入两个数:" -t 5 numb1 numb2

    if [ -z $numb1 ];then

       echo "输入两个数"

       exit 1

    fi

    if [ -z $numb2 ];then

       echo "必须输入两个数"

       exit 1

    fi

    if [ $numb1 -lt $numb2 ];then

       echo "max is $numb2,min is $numb1"

    else

       echo "max is $numb1,min is $numb2"

    fi

    五、for循环,while循环,算术运算

    循环语句

        循环的关键就是生成列表

               列表生成方式:1for i in {1..10}

                             2seq 1 10

                             3seq 1 2 10 :生成奇数列表

                             4seq 0 2 10:  生成偶数列表

    eg81.给系统添加10个用户,如果存在则提示用户存在,否则创建10个用户?(user1-user10

    #!/bin/bash

    for i in {1..10};do   ---------------for i in $(seq 1..10)

     if id user$i &>/dev/null;then

        echo "user$i exists"

     else

        useradd user$i

        echo "$i:ok"

     fi

    done

    eg91.删除刚刚创建好好的10个用户?(user1-user10

    #!/bin/bash

    for i in {1..10};do

     if id user$i &>/dev/null;then

        cd /usr/sbin

        ./userdel -r user$i

     fi

    done

    算术运算

      shell中,‘let’可以进行数值的加减乘除等运算操作,一般用于流程控制结构或者执行需要的运算,

      注意let只能执行整数的相关操作,运算结果也只能保存整数。

    运算表示:$[$a+$b]     $(($a+$b))

    eg10:求1100的整数之和

    #!/bin/bash

    declare -i sum=0

    for i in {1..100};do

      sum=$[$sum+$i]

    done

    echo $sum

    eg11:如果求1-100奇数之和

    #!/bin/bash

    declare -i sum=0

    for i in $(seq 1 2 100);do

      sum=$[$sum+$i]

    done

    echo $sum

    while循环:----用控制变量来控制

        while 条件;do

           循环体

        done

       

        进入while循环:当“条件”为真时进入

        退出while条件:当“条件”为假时退出

    eg12:求1100的整数之和

    #!/bin/bash

    declare -i sum=0

    declare -i i=0

    while [ $i -le 100 ];do

        let sum=$[$sum+$i]

        let i++

    done

    echo "sum:$sum"

    练习13:打印九九乘法表

    #!/bin/bash

    declare -i i=1

    declare -i j=1

    while [ $j -le 9 ];do

      while [ $i -le $j ];do

       echo -e -n "${i}X${j}=$[ $i*$j ] "    #-e:处理字符   -n:不换行输出   :制表符

            let i++

      done

      echo

      let i=1

      let j++

    done

    while之死循环

        格式

           while truedo

              if 条件;then

                 break

              fi

           done

    eg14:每隔三秒查看当前系统是否有chenyandan用户登入;如果登入了则显示该用户登入,如果未登入,仍然显示未登入,并显示已经是多少次查看登入情况

    #!/bin/bash

    username=$1

    declare -i count=0

    while true;do

     if who |grep "^$username";then

        echo "$username: login"

        break

     else

        let count++

        echo "$count:$username:not login"

     fi

    sleep 3

    done

    作业题:(未完成)

  • 相关阅读:
    09.非线性-指数增长模型
    08.多元线性回归模型
    07.线性回归模型
    06.齐普夫定律验证
    05.森林火灾模型
    04.沙堆模型
    03.优先链接模型
    02.中心极限定理验证
    centos6字符
    dns解析慢 修改的参数
  • 原文地址:https://www.cnblogs.com/Agnes1994/p/10662433.html
Copyright © 2011-2022 走看看