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

【Linux】【Shell】【Basic】条件测试和变量的更多相关文章

  1. Linux Shell 03 条件测试

    条件测试 方式一:在Bash中 test命令和[]是等价的. test命令: if test $n1 -eq $n2 then echo "The two number are equal& ...

  2. Linux shell if条件判断2

    前面介绍linux shell的if判断的语法,现在再补充一点. Linux shell if条件判断1 分支判断结构     if , case   下面两个结构语法,已经在前面有过示例. 结构1: ...

  3. Shell编程-条件测试 | 基础篇

    什么是Shell Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令.除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux ...

  4. 二、shell 脚本条件测试

    目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...

  5. 关于shell脚本——条件测试、if语句、case语句

    目录 一.条件测试 1.1.表达说明 1.2.test命令 文件测试 1.3.整数值比较 1.4.字符串比较 1.5.逻辑测试 二.if语句 2.1.单分支结构 2.2.双分支结构 2.3.多分支结构 ...

  6. [Linux]Shell的运算符和特殊变量

    说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...

  7. shell脚本条件测试与比较

    1.条件测试常用语法 test 测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 [ 测试表达式 ] 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试 ...

  8. Linux shell中一些参数与变量简介

    linux中shell变量$#,$@,$0,$1,$2,$!,$$,$*,$-,$@......等很多个,很容易记错,这里再次整理一下,相关含义解释如下,并附上一个实践截图. 多看几次,多用几次,应该 ...

  9. Linux Shell编程 条件判断语法

    if条件判断语句 单分支 if 条件语句 语法格式: if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi 在使用单分支 if 条件查询时需要注意几点: if ...

随机推荐

  1. Go语言核心36讲(Go语言进阶技术十六)--学习笔记

    22 | panic函数.recover函数以及defer语句(下) 我在前一篇文章提到过这样一个说法,panic 之中可以包含一个值,用于简要解释引发此 panic 的原因. 如果一个 panic ...

  2. PTA7-1 迷宫寻路 (20分)

    7-1 迷宫寻路 (20分) 给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行.在迷宫中只允许在水平或上下四个方向的通路上行走,走过 ...

  3. c++学习笔记6(结构化程序设计的不足)

    结构化程序设计 c语言使用结构化程序设计: 程序=数据结构+算法 程序有全局变量以及众多相互调用的函数组成 算法以函数的形式实现,用于对数据结构进行操作 结构化程序设计不足 软件业的目标是更快,更正确 ...

  4. 你会用ES6,那倒是用啊!

    leader的吐槽大会(在代码评审中发现很多地方还是采用ES5的写法,也不是说用ES5写法不行,会有BUG,只是造成代码量增多,可读性变差而已.) ps:ES5之后的JS语法统称ES6!!! 一.关于 ...

  5. oracle基础:怎样把查询的null转换为0、打印、定义变量

    https://blog.csdn.net/xuxile/article/details/49943665 oracle怎样把查询的null转换为0 1.查询的null转换为0 NVL(Expr1,E ...

  6. Android——ViewHolder的作用与用法

    转载至:https://www.cnblogs.com/wugu-ren/p/6106379.htmlViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重 ...

  7. [bzoj4557]侦察守卫

    令g[i][j]表示覆盖了i的子树中距离i大于等于j的所有点,f[i][j]表示覆盖了i的子树和子树外距离i小于等于j的所有点,有递推式$f[i][j]=min(f[i][j]+g[son][j],f ...

  8. [bzoj3329]Xorque

    首先将问题转化为2x^x=3x,那么相当于让x右移一位和原数的1不相交,即不含有相邻的1,第一个问题可以直接数位dp,第二个问题可以类似dp+矩乘优化即可 1 #include<bits/std ...

  9. [bzoj1303]中位数图

    由于是排列,因此b一定只出现了一次,找到出现的位置并向左右扩展考虑如何判定是否满足条件,当且仅当$[左边比b小的数ls]+[右边比b小的数rs]=[左边比b大的数lb]+[右边比b大的数rb]$,暴力 ...

  10. [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础

    [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 目录 [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 0x00 摘要 0x0 ...