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. WPF进阶技巧和实战09-事件(1-路由事件、鼠标键盘输入)

    理解路由事件 当有意义的事情发生时,有对象(WPF的元素)发送的用于通知代码的消息,就是事件的核心思想.WPF通过事件路由的概念增强了.NET事件模型.事件由允许源自某个元素的事件由另一个元素引发.例 ...

  2. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  3. 设计模式学习-使用go实现装饰模式

    装饰器模式 定义 代码实现 优点 缺点 适用范围 装饰器模式和桥接模式的区别 参考 装饰器模式 定义 装饰模式:动态的给一些对象添加额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 举个栗子: ...

  4. NOIP模拟99(多校31)

    T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...

  5. 第02章_MySQL环境搭建

    第02章_MySQL环境搭建 1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务.按键盘上的"Ctrl + Alt + Delete"组合 ...

  6. CSharp使用Thrift作为RPC框架入门(一)

    前言 本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++ ...

  7. 谱文混排之lilypond-book

    Lilypond有自带的谱文混排的工具lilypond-book,但是作为外行,一直很难搞清楚这个操作是怎样做的.很久之前请教过别人,但介于我的个人能力,只有粗浅理解,操作不得要领.在许多信息的拼凑之 ...

  8. 最小生成树(MST)详解+题目

    原因 回顾一下旧知识 概况 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无 ...

  9. DirectX12 3D 游戏开发与实战第十章内容(上)

    仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...

  10. Hermite WENO 重构格式

    Hermite WENO 单元重构 本文主要介绍采用 Hermite WENO 重构方法作为斜率限制器应用于二维或高维单元中. 1.简介[1] ENO格式最早由 Harten 等[2]提出,ENO格式 ...