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

    作业题:(未完成)

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/Agnes1994/p/10662433.html
Copyright © 2011-2022 走看看