【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 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号