zoukankan      html  css  js  c++  java
  • 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、通过命令行参数给定两个文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;

  • 相关阅读:
    Balance的数学思想构造辅助函数
    1663. Smallest String With A Given Numeric Value (M)
    1680. Concatenation of Consecutive Binary Numbers (M)
    1631. Path With Minimum Effort (M)
    1437. Check If All 1's Are at Least Length K Places Away (E)
    1329. Sort the Matrix Diagonally (M)
    1657. Determine if Two Strings Are Close (M)
    1673. Find the Most Competitive Subsequence (M)
    1641. Count Sorted Vowel Strings (M)
    1679. Max Number of K-Sum Pairs (M)
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12134128.html
Copyright © 2011-2022 走看看