zoukankan      html  css  js  c++  java
  • 测试开发必备技能之shell脚本编程一【多测师】

    一)Shell基本定义:
    1,bash的基础特性
    shell是一种命令行解释器,是为用户和操作系统之间的通信提供的一种接口
    bash重要的特性之二:命令补全
    根据内建命令或或外部命令各自查找方式查找以用户指定的字符开头的命令:
    如果用户指定的开头的字符串能惟一标识某命令,则tab键可直接补全此命令;
    否则,则两次tab键可显示所有以指定字符串开头的命令;

    2,路径补全:
    路径:/usr/share/doc
    路径基名:doc
    目录名:/usr/share
    # basename NAME [SUFFIX]
    # dirname NAME
    bash的工作特性之三:命令执行状态返回值
    命令执行成功与否的状态,由bash自己追踪;保存在特殊变量“$?”中;
    0-255:
    0:成功
    1-255: 失败

    3,程序的组成部分:二进制程序、库、配置文件、帮助文件
    echo命令:
    echo [OPTIONS] [STRING]...
    -n: 关闭自动换行功能
    -e: 启用转义符
    : tab键
    : new line
    declare声明变量的类型
    相当于global 声明一个变量为全局变量 
    export.UTF-8 export
    Linux操作系统下终端乱码的终极解决方案 
    upfile1576248235591.png 
    upfile1576248253017.png 

    4,启动脚本:(1)#bash /PATH/TO/SCRIPT_FILE
    (2)#需要执行权限, ./PATH/TO/SCRIPT_FILE
    (3)shebang:#!/bin/bash
    bash的常用选项:
      -n:检查脚本中的语法
      -x:调试执行脚本

    5,测试表达式;
    test EXPRESSION
    [ EXPRESSION ]
    [[ EXPRESSION ]]
    整数测试:隐含着做数值大小比较,所以不要给变量引用加引用
    $A -gt $B:是否大于,是则为真,否则为假
    $A -ge $B:是否大于等于
    $A -lt   $B:是否小于
    $A -le  $B:是否小于等于
    $A -eq $B:是否等于
    $A -ne $B:是否不等于
    字符串测试:ASCII数值越大,字符比较时其值越大:
    "$A" > "$B":是否大于
    "$A" < "$B":是否小于
    "$A" == "$B":是否等于
    "$A" != "$B":是否不等于
    -z "$A":是否为空,空则为"真",否则为"假"
    -n "$A":是否不空,不空则为真,否则为假
    注意:应用使用[[ EXPRESSION ]]


    文件测试:测试文件存在及属性:
    -e $file:是否存在:如果存在为真,否则为假
    -a $file:同参数-e
    -f  $file:判断文件是否存在且为普通文件
    -d $file:文件是否存在且目录
    -h $file:是否存在且为符号链接文件
    -L $file:同参数-h
    -b $file:是否存在且为块设备文件
    -c $file:是否存在且为字符设备文件
    -S $file:是否存在且为套接字文件
    -p $file:是否存在且为管道文件
    -r $file:当前用户对文件是否拥有读权限
    -w $file:当前用户对文件是否拥有写权限
    -x  $file:当前用户对文件是否拥有执行权限
    -u $file:文件是否拥有SUID权限
    -g $file:文件是否拥有SGID权限
    -k $file:文件是否拥有sticky权限
    -O $file:当前用户是否为指定文件的属主
    -G $file:当前用户是否为指定文件的属组

    二)Shell脚本练习一:
    1,写一个程序,判断文件是否存在,没有则创建;
    upfile1576248265663.png 
    2,统计某一个文件的行数;
    upfile1576248275223.png 
    3,比较俩个数的大小;
    upfile1576248284811.png 
    4,统计文件的行数;
    upfile1576248294303.png 
    [root@localhost xiaoshu5]# cat xiaoshu3.sh
    #!/bin/bash
    #author by xiaowang
    if [ $# -lt 1 ]; then
        echo "at least one agument"
        exit 1
    fi
    if [ -f $1 ]; then
        lines=$(wc -l $1|cut -d' ' -f1)
        echo "$1 has $lines lines"
    else
        echo "$1 not exists or not a file!"
    fi
    [root@localhost xiaoshu5]# sh xiaoshu3.sh
    at least one agument
    [root@localhost xiaoshu5]# sh xiaoshu3.sh xiaowang.py
    xiaowang.py has 9 lines
    [root@localhost xiaoshu5]# sh xiaoshu3.sh xiaoxiao
    xiaoxiao not exists or not a file!
    [root@localhost xiaoshu5]#  
    5,1-100之内奇数之和;
    upfile1576248304573.png 
    6,1-100之内偶是之和;
    upfile1576248314884.png 

    三)Shell脚本练习二:
    1、如果目录不存在,则创建它,否则显示其存在,并显示内容类型
        #!/bin/bash
        #
        filename="/home/duoceshi/shell"
        if [ -e $filename ];then
            echo "$filename exists"
            file $filename
        else
            mkdir -p $filename
        fi
    2、判断脚本传入的第一个位置参数$1是否为文件,如果是文件则统计文件行数,否则显示文件不存在或不是一个文件
        #!/bin/bash
        #
        if [ -f $1];then
             wc -l $1
        else
            echo "$1 not exists or not a file"
        fi
    3、判断给定的两个数字大小
    #!/bin/bash
    #author:xiaoqian
    read -p "Please enter two number:" -t 10 num1 num2基本篇.note
    if [ -z $num1 ]; then
        echo "at least two number!"
        exit 1
    fi
    if [ $num1 -lt $num2 ]; then
        echo "the max number is $num2,the min number is $num1"
    else
        echo "the max number is $num1,the min number is $num2!"
    fi
    4、输入一个用户,如果输入的用户存在则显示用户存在,否则创建用户,再如果输入为空,则提示用户不能为空后退出
    #!/bin/bash
    #
    read -p "Please enter a username:" -t 10 username
    if [ -z "$username" ]; then
        username="test"
    fi
    echo $username
    if id $username &> /dev/null; then
        echo "$username exists"
    else
        useradd $username
    fi


    5、如果输入的位置参数$1为空,程序则退出,再如果输入的位置参数为文件,则统计文件行数,并取出行数
    #!/bin/bash
    #
    if [ $# -lt 1 ]; then
        echo "at least one argument"
        exit 1
    fi
    if [ -f $1 ]; then
        lines=$(wc -l $1|cut -d' ' -f1)
        echo "$1 has $lines lines"
    else
        echo "$1 not exists or not a file!"
    fi
    6、给系统添加10个用户,如果存在则提示用户存在,否则创建10个用户
    #!/bin/bash
    #create by  xiaoqian
    for i in {1..10};do   #等价于:for i in $(seq 1 10);do
        if id user$i &> /dev/null; then
            echo "user$i exists!"
        else
            useradd user$i
             echo "add user user$i finished"
        fi
    done
    7、显示/var/log目录下所有文件的类型
    #!/bin/bash
    #
    for filename in /var/log/*;do
        file $filename
    done
    8、取出系统所有用户的主组
    #!/bin/bash
    #
    for username in $(cut -d: -f1 /etc/passwd);do
         echo "$username primary group:$(id -n -g $username)"   #id -n -g username也可以写成id -ng username
    done
    9、求1到100之间的和
    #!/bin/bash
    #
    declare -i sum=0
    for i in $(seq 1 100);do
        let sum+=$i #也可以写成sum=$[$sum+$i]
    done
    echo $sum
    10、求1到100内之间偶数之和
    第一种方法:
    #!/bin/bash
    #
    declare -i sum=0
    for i in $(seq 1 2 100);do
         sum=$[$sum+$i]   #相当于let sum+=$i
    done
    echo $sum
    第二种方法:
    #!/bin/bash
    #
    declare -i sum=0
    for i in $(seq 1  100);do
        if [ $(($i %2 )) -eq 0 ]; then #$(($i % 2))可以写成$[$i%2]
            sum=$[$sum+$i]  #相当于let sum+=$i
        fi
    done
    echo $sum

     

    11、显示当前系统用户ID号为偶数的用户名和用户ID
    12、显示/var/log目录下所有的普通文件,然后统计一共有多少个这样的文件
    #!/bin/bash
    #
    declare -i counter=0
    for filename in /var/log/*;do
        if [ -f $filename ]; then
            let counter++
            echo "Total:$counter files,$filename"
        fi
    done

    13、获取当前主机名称,如果当前主机名为空或为localhost时,则将它修改为www.duoceshi.com
    #!/bin/bash
    #create by icestic chien
    hostname=`hostname`
    if [ -z $hostname -o $hostname == 'localhost' ]; then
        hostname www.duoceshi.com
    fi
    14、写一个脚本,传入一个文件参数判断,传入的文件是什么类型文件?
    if [ $# -lt 1 ]; then
        echo "at least 1 agrs."
        exit 1
    fi
    if [ -f $1 ]; then
        echo "Regular file."
    elif [ -d $1 ]; then
        echo "Directory!"
    elif [ -h $1 ]; then
        echo "Symbolic link."
    elif [ -b $1 ]; then
        echo "Block special."
    elif [ -c $1 ]; then
        echo "Character special."
    elif [ -S $1 ]; then
        echo "Socket file."
    else
        echo "file type is not exists!"
    fi
    15、打印九九乘法表
    #!/bin/bash
    #
    for i in {1..9}; do
        for j in $(seq 1 $i); do
            echo -n -e "${j}X${i}=$[${i}*${j}] "
        done
        echo
    done
    16、写一个脚本,分别可以传4个参数为:start、stop、restart、status,如果是start参数创建一个文件,如果是stop删除一个文件,如果是restart先删除再创建,如果是status显示文件状态,如果存在则显示running,否则显示not running...


    #!/bin/bash
    #
    prog=$(basename $0)
    lockfile="/var/lock/subsys/$prog"
    #echo $lockfile


    if [ $# -lt 1 ]; then
        echo "Usage:$prog start|stop|restart|status"
        exit 1
    fi
    if [ "$1" == "start" ]; then
        if [ -f $lockfile ]; then
            echo "$prog is started yet."
        else
            touch $lockfile && echo "Starting $prog ok.." ||echo "Starting $prog failed..."
        fi
    elif [ "$1" == "stop" ]; then
        if [ -f $lockfile ]; then
            rm -rf $lockfile && echo "Stop $prog ok.." || echo "Stop $prog failed..."
        else
            echo "$prog is stopped yet."
        fi
    elif [ "$1" == "restart" ]; then
        if [ -f $lockfile ]; then
            rm -f $lockfile && touch $lockfile && echo "Restarting $prog ok.."
        else
            touch $lockfile && echo "$prog is stopped,Starting $prog ok.."
        fi
    elif [ "$1" == "status" ]; then
        if [ -f $lockfile ]; then
            echo "Running..."
        else
            echo "Stopped.."
        fi
    else
        echo "Usage:$prog start|stop|restart|status"
        exit 1
    fi






    #!/bin/bash
    #
    prog=$(basename $0)
    lockfile="/var/lock/subsys/$prog"
    #echo $lockfile


    if [ $# -lt 1 ]; then
        echo "Usage:$prog start|stop|restart|status"
        exit 1
    fi
    case $1 in
    start)
        if [ -f $lockfile ]; then
            echo "$prog is started yet."
        else
            touch $lockfile && echo "Starting $prog ok.." ||echo "Starting $prog failed..."
        fi
        ;;
    stop)
        if [ -f $lockfile ]; then
            rm -rf $lockfile && echo "Stop $prog ok.." || echo "Stop $prog failed..."
        else
            echo "$prog is stopped yet."
        fi
        ;;
    restart)
        if [ -f $lockfile ]; then
            rm -f $lockfile && touch $lockfile && echo "Restarting $prog ok.."
        else
            touch $lockfile && echo "$prog is stopped,Starting $prog ok.."
        fi
        ;;
    status)
        if [ -f $lockfile ]; then
            echo "Running..."
        else
            echo "Stopped.."
        fi
        ;;
    *)
        echo "Usage:$prog start|stop|restart|status"
        exit 1


    esac




    循环相关
    1、求100以内正整数之和
    #!/bin/bash
    #
    declare -i sum=0
    for i in $(seq 1 100);do
        let sum+=$i #也可以写成sum=$[$sum+$i]
    done
    echo $sum


    #!/bin/bash
    #
    declare -i i=1
    declare -i sum=0
    while [ $i -le 100 ]; do
        let sum+=$i
        let i++
    done
    echo "The sum is:$sum"


    2、打印九九乘法表
    #!/bin/bash
    #
    for i in {1..9}; do
        for j in $(seq 1 $i); do
            echo -n -e "${j}X${i}=$[${i}*${j}] "
        done
        echo
    done


    #!/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] "
            let i++
        done
        echo
        let i=1
        let j++
    done


    3,startup脚本:
    #!/bin/sh
    # Tomcat init script for Linux.
    #
    # chkconfig: 2345 96 14
    # description: The Apache Tomcat servlet/JSP container.
    # JAVA_OPTS='-Xms64m -Xmx128m'
    JAVA_HOME=/usr/java/lastest
    CATALINA_HOME=/usr/local/tomcat
    export JAVA_HOME CATALINA_HOME


    case $1 in
    start)
      exec $CATALINA_HOME/bin/catalina.sh start ;;
    stop)
      exec $CATALINA_HOME/bin/catalina.sh stop;;
    restart)
      $CATALINA_HOME/bin/catalina.sh stop
      sleep 2
      exec $CATALINA_HOME/bin/catalina.sh start ;;
    *)
      echo "Usage: `basename $0` {start|stop|restart}"
      exit 1
      ;;
    esac

  • 相关阅读:
    LCA算法总结
    【福利】论机房如何关闭方正软件保护卡
    codevs 2190 有理逼近
    用C语言的rand()和srand()产生伪随机数的方法总结
    float,double等精度丢失问题 float,double内存表示
    #incldue<cctype>函数系列
    poj 2348 Euclid's Game 题解
    poj 2240 Arbitrage 题解
    洛谷 p1352 没有上司的舞会 题解
    BZOJ 1093 最大半连通子图 题解
  • 原文地址:https://www.cnblogs.com/xiaoshubass/p/12865074.html
Copyright © 2011-2022 走看看