• linux学习31 运维核心技能-shell脚本逻辑判断和参数传递


    一、bash脚本编程

      1、文件测试

        a、存在性测试

          -a FILE

          -e FILE

          文件的存在性测试,存在则为真,不存在则为假

    [root@node1 ~]# [ -e /etc/rc.d/rc.sysinit ]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [ -e /etc/rc.d/rc.local ]
    [root@node1 ~]# echo $?
    0

        b、存在性及类型测试

          -b FILE:是否存在并且为块设备文件

    [root@node1 ~]# [ -b /dev/sda ]
    [root@node1 ~]# echo $?
    0

          -c FILE:是否存在并且为字符设备文件

          -d FILE:是否存在并且为目录文件

          -f FILE:是否存在并且为普通文件

          -h FILE或-L FILE:是否存在并且为符号链接文件

          -p FILE:是否存在且为命名管道文件

          -S FILE:是否存在且为套接字文件

        c、文件权限测试

          -r FILE:是否存在并且对当前用户可读;

          -w FILE:是否存在并且对当前用户可写

          -x FILE:是否存在并且对当前用户可执行

        d、特殊权限测试

          -u FILE:是否存在并且拥有suid权限

          -g FILE:是否存在并且拥有sgid权限

          -k FILE:是否存在并且拥有stlcky权限

        e、文件是否有内容

          -s FILE:文件是否有内容,有则为真,没有则为假

    [root@node1 ~]# touch /tmp/testfile
    [root@node1 ~]# [ -s /tmp/testfile ]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# echo "wohaoshuai" >> /tmp/testfile 
    [root@node1 ~]# [ -s /tmp/testfile ]
    [root@node1 ~]# echo $?
    0

        f、对文件的时间戳做测试

          -N FILE:文件自从上一次读操作后是否被修改过

        g、从属关系测试

          -O FILE:当前用户是否为文件的属主

          -G FILE:当前有效用户是否属于文件的属组

        h、双目测试

          FILE1 -ef  FILE2:文件1和文件2是否为指向同一个文件系统上的相同inode的硬链接

          FILE1 -nt FILE2 :FILE1是否新于FILE2

          FILE1 -ot FILE2 :FILE1是否旧于FILE2

      2、组合测试条件

        a、逻辑运算

          第一种方式:

            COMMAND1 && COMMAND2

            COMMAND1 || COMMAND2

            !COMMAND

            [ -O FILE ] && [ -r FILE ]

          第二种方式:

            EXPRESSION1 -a  EXPRESSION2 #与运算

            EXPRESSION -o EXPRESSION2 #或运算

            !EXPRESSION

            [ -O FILE -a -x FILE ]

      3、练习:

        a、将当前主机名称保存至hostName变量中,主机名如果为空,或者为localhost.localdomain,则将其设置为www.wohaoshuai.com;

          hostName=$(hostname)

          [ -z "$hostName" -o "$hostName"=="localhost.localdomain" -o "$hostName"=="localhost" ] && hostname www.wohaoshuai.com

    二、如何向脚本传递参数

      1、位置参数变量

        myscript.sh argu1 argu2

        a、引用方式:

          $1,$2,...${10},${11}...

    [root@node1 script]# cat sum.sh 
    #!/bin/bash
    #
    echo $[$1 + $2]
    [root@node1 script]# bash sum.sh 2 3
    5

        b、轮替。shift [n]:位置参数轮替。

    [root@node1 script]# cat shift.sh 
    #!/bin/bash
    echo "First and second pos argu: $1,$2"
    shift 2 #一脚踢掉两个参数,因此下一个参数又会从$1开始,如果不指定默认会踢掉一个
    echo "Third pos argu $1"
    [root@node1 script]# bash shift.sh one two three
    First and second pos argu: one,two
    Third pos argu three

        c、练习:写一个脚本,通过命令行传递两个文本文件路径给脚本,计算其空白行数之和

    [root@node1 script]# cat lines.sh 
    #!/bin/bash
    file1_lines=$(grep "^$" $1|wc -l)
    file2_lines=$(grep "^$" $2|wc -l)
    
    echo "Total blank lines:$[$file1_lines+$file2_lines]"
    
    [root@node1 script]# bash lines.sh /etc/fstab /etc/issue
    Total blank lines:2

      2、特殊变量

        $0:脚本文件路径本身

    [root@node1 script]# cat filename.sh 
    #!/bin/bash
    echo $0
    [root@node1 script]# bash filename.sh 
    filename.sh

        $#:显示参数个数

    [root@node1 script]# cat pos.sh 
    #!/bin/bash
    echo "$1,$2"
    echo $#
    [root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
    wohaoshuai1,wohaoshuai2
    2
    [root@localhost script]# cat lines.sh 
    #!/bin/bash
    [ $# -lt 2 ] && echo "At least two file" && exit 1
    file1_lines=$(grep "^$" $1|wc -l)
    file2_lines=$(grep "^$" $2|wc -l)
    
    echo "Total blank lines:$[$file1_lines+$file2_lines]"
    [root@localhost script]# bash lines.sh /etc/fstab 
    At least two file
    [root@localhost script]# echo $?
    1

        $*:所有参数

          "hello"  "hi"  "toyou"

        $@:所有参数

          "hello hi toyou"

    [root@node1 script]# cat pos.sh 
    #!/bin/bash
    echo "$1,$2"
    echo $#
    echo $*
    echo $@
    [root@node1 script]# bash pos.sh wohaoshuai1 wohaoshuai2
    wohaoshuai1,wohaoshuai2
    2
    wohaoshuai1 wohaoshuai2
    wohaoshuai1 wohaoshuai2

    三、条件判断

      1、过程式编程语言的代码执行顺序

        a、顺序执行:逐条运行

        b、选择执行:

          代码有一个分支:条件满足时才会执行

          两个或以上的分支:只会执行其中一个满足条件的分支

        c、循环执行:

          代码片段(循环体)要执行0、1或多个来回

      2、相应写法

        a、选择执行

          (1)、单分支的if语句:

            if 测试条件;then

              分支

            fi

          (2)、双分支的if语句:

            if 测试条件; then

              条件为真实执行的分支

            else

              条件为假时执行的分支

            fi

          示例:通过参数传递一个用户名给脚本,此用户不存在时,则添加之

    [root@localhost script]# cat useradd.sh 
    #!/bin/bash
    if ! grep "^$1>" /etc/passwd &> /dev/null;then
        useradd $1
        echo $1 |passwd --stdin $1 &> /dev/null
        echo "Add user $1 finished."
    fi
    [root@localhost script]# bash useradd.sh hbase
    Add user hbase finished.
    [root@localhost script]# cat useradd.sh 
    #!/bin/bash
    if [ $# -lt 1 ];then
        echo "At least one username."
        exit 2
    fi
    if ! grep "^$1>" /etc/passwd &> /dev/null;then
        useradd $1
        echo $1 |passwd --stdin $1 &> /dev/null
        echo "Add user $1 finished."
    fi
    [root@localhost script]# bash useradd.sh 
    At least one username.
    [root@localhost script]# echo $?
    2
    [root@localhost script]# cat useradd.sh 
    #!/bin/bash
    if [ $# -lt 1 ];then
        echo "At least one username."
        exit 2
    fi
    if  grep "^$1>" /etc/passwd &> /dev/null;then
        echo "User $1 exists"
    else
        useradd $1
        echo $1 |passwd --stdin $1 &> /dev/null
        echo "Add user $1 finished."
    fi
    [root@localhost script]# bash useradd.sh hbase
    User hbase exists

      3、练习

        a、通过命令行参数给定两个数字,输出其中较大的数字

    [root@localhost script]# cat big.sh 
    #!/bin/bash
    if [ $# -lt 2 ];then
        echo "Two intergers"
        exit 2 
    fi
    if [ $1 -ge $2 ];then
        echo "Max number; $1."
    else
        echo "Max number; $2."
    fi
    [root@localhost script]# chmod +x big.sh 
    [root@localhost script]# ./big.sh 4 6
    Max number; 6.
    [root@localhost script]# ./big.sh 4 
    Two intergers
    [root@localhost script]# cat big.sh 
    #!/bin/bash
    declare -i max 
    if [ $# -lt 2 ]; then
        echo "Two intergers"
        exit 2 
    fi
    if [ $1 -ge $2 ];then
        max=$1
    else
        max=$2
    fi
    echo $max
    [root@localhost script]# bash big.sh 4 6
    6

        b、通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数

        c、通过命令行参数给定两个文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;

  • 相关阅读:
    素数
    超级素数
    SUMMARIZE 6.1
    广度优先搜索与八字码问题
    poj2352
    poj1198
    康托展开
    STL里的内存池实现
    构造函数,C++内存管理,内存泄漏定位
    内联函数,宏定义,内存对齐,类型转换
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12134128.html
Copyright © 2020-2023  润新知