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. vue引入elementUI(第三方样式库)

    前置: 在已经安装好vue的前提下 ,没有安装vue参考: vue搭建教程 elementUI官网组件使用文档: elementUI使用文档 1.终端直接运行安装命令 npm i element-ui ...

  2. Python MySSH 实现剧本执行器

    通过封装Paramiko这个SSH模块,我们可以实现远程批量管理Linux主机,在上一篇文章中我们封装过一个MySSH类,这个类可以执行命令上传下载文件等,我们在这个类的基础上,实现一个简单的任务执行 ...

  3. mysql-5.7.30安装

    1.由于在线安装受制于网络环境,所以选择tar包编译安装.      首先去mysql镜像站下载mysql-5.7.30-linux-glibc2.5-x86_64.tar.gz2.上传到linux服 ...

  4. python 字符串和时间格式(datetime)相互转换-

    2019-03-17 11:00:00格式转化 import datetime # str转时间格式: dd = '2019-03-17 11:00:00' dd = datetime.datetim ...

  5. go 错误处理设计思考

    前段时间准备对线上一个golang系统服务进行内部开源,对代码里面的错误处理进行了一波优化. 优化的几个原因: 错误处理信息随意,未分类未定义.看到错误日志不能第一时间定位 错误的日志重复,有时候一个 ...

  6. php多域名跳转nginx

    当web服务器nginx已经配置好了网站根目录时,需要增加另外的域名.但是由于限制必须在原来的网站根目录下面,nginx已经无法实现.只能通过php index页面进行调试.如下面: define(' ...

  7. [luogu5204]Train Tracking 2

    考虑一个位置的上界,即$bi=min(c_{i-k+1},c_{i-k+2},--,ci)$,那么每一个位置有两种方式:1.达到上界:2.未达到上界那么可以将权值相同的ci和bi提出来,由于权值不同的 ...

  8. 【POJ1845】Sumdiv【算数基本定理 + 逆元】

    描述 Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine ...

  9. 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)

    洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...

  10. 洛谷 P5853 - [USACO19DEC]Tree Depth P(生成函数+背包)

    洛谷题面传送门 神仙题. 首先考虑一个点的深度是什么,注意到对于笛卡尔树而言直接从序列的角度计算一个点的深度是不容易的,因为这样会牵扯到序列中多个元素,需要 fixed 的东西太多,计算起来太复杂了. ...