zoukankan      html  css  js  c++  java
  • 【Linux】【Shell】【Basic】条件测试和变量

    bash脚本编程
     
        脚本文件格式:
            第一行,顶格:#!/bin/bash
            注释信息:#
            代码注释:
            缩进,适度添加空白行;
             
        语言:编程语法格式,库,算法和数据结构
        编程思想:
            问题空间 --> 解空间
             
        变量:
            局部变量
            本地变量
            环境变量
             
            位置参数变量
            特殊变量
             
        数据类型:字符型、数值型
            弱类型:字符型
             
        算术运算:
            +, -, *, /, %, **
             
            let  VAR=expression
            VAR=$[expression]
            VAR=$((expression))
            VAR=$(expr argu1 argu2 argu3)
             
            注意:有些时候乘法符号需要转义;
             
            增强型赋值:
                变量做某种算术运算后回存至此变量中;
                    let i=$i+#
                    let i+=#
                     
                +=,-=,*=, /=, %=
                 
                自增:
                    VAR=$[$VAR+1]
                    let  VAR+=1
                    let  VAR++
                     
                自减:
                    VAR=$[$VAR-1]
                    let  VAR-=1
                    let  VAR--
                     
        练习:
            1、写一个脚本
                计算/etc/passwd文件中的第10个用户和第20个用户的id号之和;
                    id1=$(head -10  /etc/passwd | tail -1  | cut  -d:  -f3)
                    id2=$(head -20   /etc/passwd | tail -1  | cut  -d:  -f3)
                     
                 
            2、写一个脚本
                计算/etc/rc.d/init.d/functions和/etc/inittab文件的空白行数之和;
                 
                    grep "^[[:space:]]*$"   /etc/rc.d/init.d/functions | wc -l
                     
        条件测试:
            判断某需求是否满足,需要由测试机制来实现;
             
            如何编写测试表达式以实现所需的测试:
                (1) 执行命令,并利用命令状态返回值来判断;
                    0:成功
                    1-255:失败
                (2) 测试表达式
                    test  EXPRESSION
                    [ EXPRESSION ]
                    [[ EXPRESSION ]]
                     
                    注意:EXPRESSION两端必须有空白字符,否则为语法错误;
                     
            bash的测试类型:
                数值测试
                字符串测试
                文件测试
                 
                数值测试:数值比较
                    -eq:是否等于; [ $num1 -eq $num2 ]
                    -ne:是否不等于;
                    -gt:是否大于;
                    -ge:是否大于等于;
                    -lt:是否小于;
                    -le:是否小于等于;
                     
                字符串测试:
                    ==:是否等于;
                    >:是否大于;
                    <:是否小于;
                    !=:是否不等于;
                    =~:左侧字符串是否能够被右侧的PATTERN所匹配;
                     
                    -z "STRING":判断指定的字串是否为空;空则为真,不空则假;
                    -n "STRING":判断指定的字符串是否不空;不空则真,空则为假;
                     
                    注意:
                        (1) 字符串要加引用;
                        (2) 要使用[[ ]];
                         
                文件测试:
                    存在性测试
                        -a  FILE
                        -e  FILE
                            文件的存在性测试,存在则为真,否则则为假;
                    存在性及类型测试
                        -b  FILE:是否存在并且为 块设备 文件;
                        -c  FILE:是否存在并且为 字符设备 文件;
                        -d  FILE:是否存在并且为 目录文件;
                        -f  FILE:是否存在并且为 普通文件;
                        -h  FILE或 -L  FILE:是否存在并且为 符号链接文件;
                        -p FILE:是否存在且为 命名管道文件;
                        -S  FILE:是否存在且为 套接字文件;
                    文件权限测试:
                        -r  FILE:是否存在并且 对当前用户可读;
                        -w  FILE:是否存在并且 对当前用户可写;
                        -x  FILE:是否存在并且 对当前用户可执行;
                    特殊权限测试:
                        -u  FILE:是否存在并且 拥有suid权限;
                        -g  FILE:是否存在并且 拥有sgid权限;
                        -k  FILE:是否存在并且 拥有sticky权限;
                    文件是否有内容:
                        -s  FILE:是否有内容;
                    时间戳:
                        -N FILE:文件自从上一次读操作后是否被修改过;
                    从属关系测试:
                        -O  FILE:当前用户是否为文件的属主;
                        -G  FILE:当前用户是否属于文件的属组;
                    双目测试:
                        FILE1  -ef  FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;
                        FILE1  -nt  FILE2:FILE1是否新于FILE2;
                        FILE1  -ot  FILE2:FILE1是否旧于FILE2;
                         
                组合测试条件:
                    逻辑运算:
                        第一种方式:
                            COMMAND1 && COMMAND2
                            COMMAND1 || COMMAND2
                            ! COMMAND
                             
                            [ -O FILE ] && [ -r FILE ]
                             
                        第二种方式:
                            EXPRESSION1  -a  EXPRESSION2
                            EXPRESSION1  -o  EXPRESSION2
                            ! EXPRESSION
                             
                            [ -O FILE -a -x FILE ]
                             
                    练习:将当前主机名称保存至hostName变量中;
                        主机名如果为空,或者为localhost.localdomain,则将其设置为www.magedu.com;
                         
                        hostName=$(hostname)
                         
                        [ -z "$hostName" -o "$hostName" == "localhost.localdomain" -o "$hostName" == "localhost" ] && hostname www.magedu.com                  
                         
            脚本的状态返回值:
                默认是脚本中执行的最后一条件命令的状态返回值;
                自定义状态退出状态码:
                    exit  [n]:n为自己指定的状态码;
                        注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束;
                         
        向脚本传递参数:
            位置参数变量
             
            myscript.sh  argu1 argu2
                引用方式:
                    $1,  $2, ..., ${10}, ${11}, ...
                     
                轮替:
                    shift  [n]:位置参数轮替;
                     
            练习:写一脚本,通过命令传递两个文本文件路径给脚本,计算其空白行数之和;
                 
                #!/bin/bash
                #
                file1_lines=$(grep "^$" $1 | wc -l)
                file2_lines=$(grep "^$" $2 | wc -l)
     
                echo "Total blank lines: $[$file1_lines+$file2_lines]" 
                 
        特殊变量:
            $0:脚本文件路径本身;
            $#:脚本参数的个数;
            $*:所有参数
            $@:所有参数
     
        过程式编程语言的代码执行顺序:
            顺序执行:逐条运行;
            选择执行:
                代码有一个分支:条件满足时才会执行;
                两个或以上的分支:只会执行其中一个满足条件的分支;
            循环执行:
                代码片断(循环体)要执行0、1或多个来回;
                 
            选择执行:
                单分支的if语句:
                    if  测试条件
                    then
                        代码分支
                    fi
                 
                双分支的if语句:
                    if  测试条件; then
                        条件为真时执行的分支
                    else
                        条件为假时执行的分支
                    fi
                     
            示例:通过参数传递一个用户名给脚本,此用户不存时,则添加之;
                #!/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 
                 
                #!/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     
                     
                #!/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         
                 
            练习1:通过命令行参数给定两个数字,输出其中较大的数值;
                #!/bin/bash
                #
                if [ $# -lt 2 ]; then
                    echo "Two integers."
                    exit 2
                fi
     
                if [ $1 -ge $2 ]; then
                    echo "Max number: $1."
                else
                    echo "Max number: $2."
                fi
     
                 
                #!/bin/bash
                #
     
                if [ $# -lt 2 ]; then
                    echo "Two integers."
                    exit 2
                fi
     
                declare -i max=$1
     
                if [ $1 -lt $2 ]; then
                    max=$2
                fi
     
                echo "Max number: $max."
                         
            练习2:通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数;
            练习3:通过命令行参数给定两个文本文件名,如果某文件不存在,则结束脚本执行;
                都存在时返回每个文件的行数,并说明其中行数较多的文件;
             
             
        练习:
            1、创建一个20G的文件系统,块大小为2048,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项;
                (1) 创建20G分区;
                (2) 格式化:
                    mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
                (3) 编辑/etc/fstab文件
                LABEL='TEST'    /testing    ext4    defaults,acl    0 0
     
            2、创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3;
     
            3、写一个脚本,完成如下功能:
                (1) 列出当前系统识别到的所有磁盘设备;
                (2) 如磁盘数量为1,则显示其空间使用信息;
                    否则,则显示最后一个磁盘上的空间使用信息;
                    if [ $disks -eq 1 ]; then
                        fdisk -l /dev/[hs]da
                    else
                        fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o "^Disk /dev/[sh]d[a-]" | tail -1 | cut -d' ' -f2)
                    fi
  • 相关阅读:
    MySql错误解决方案汇总
    不适合做管理的人zz
    linux 自动执行 crontab学习笔记
    Google Megastore分布式存储技术全揭秘zz
    【算法】n个人围成一圈报数,报到3的退出,下面接着从1开始报,问最后剩下的是谁?
    大数据下的数据分析平台架构zz
    ETL的可扩展性和可维护性zz
    【算法】各种排序算法测试代码
    谈爱情故事,谈观察者模式
    解读设计模式单例模式(Singleton Pattern)
  • 原文地址:https://www.cnblogs.com/demonzk/p/6296924.html
Copyright © 2011-2022 走看看