Bash脚本编程(2)——编程入门

作者: 逃跑中计划 | 来源:发表于2016-03-28 22:00 被阅读872次

    @(Bash)[编程入门]


    1. Bash中的变量

    1.1 变量类型

    • 字符型
    • 数值型
    • 整型
    • 浮点型

    语言类型:

    • 强类型:
      定义变量时必须指定类型、参与运算必须符合类型要求;
      调用未声明变量会产生错误;
    • 弱类型:
      无须指定类型,默认均为字符型;
      参与运算会自动进行隐式类型转换;
      变量无须事先定义可直接调用;

    1.2 变量的种类

    (1)本地变量
    生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
    (2)环境变量
    生效范围为当前shell进程及其子进程;
    (3)局部变量
    生效范围为当前shell进程中某代码片断(通常指函数);
    (4)位置变量
    $1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
    (5)特殊变量
    $?, $0, $*, $@, $#

    1.3 本地变量

    变量赋值:name='value'
    (1) 可以是直接字串:name="username"
    (2) 变量引用:name="$username"
    (3) 命令引用:name=COMMAND, name=$(COMMAND)

    变量引用:
    ${name}, $name

    引用分类:
    ""弱引用,其中的变量引用会被替换为变量值;
    ''强引用,其中的变量引用不会被替换为变量值,而保持原字符串;

    显示已定义的所有变量:
    set

    销毁变量:
    unset name

    1.4 环境变量

    变量声明、赋值:
    export name=VALUE
    declare -x name=VALUE

    只读变量:
    readonly name
    declare -r name

    变量引用:
    $name, ${name}

    显示所有环境变量:
    export
    env
    printenv

    销毁:
    unset name

    变量命名法则:
    (1) 不能使程序中的保留字:例如if, for
    (2) 只能使用数字、字母及下划线,且不能以数字开头
    (3) 见名知义

    1.5 位置变量

    在脚本代码中调用通过命令行传递给脚本的参数
    $1, $2, ...:对应调用第1、第2等参数
    $0: 命令本身

    shift [n]
    用来偏移未知变量的一个命令

    1.6 特殊变量

    • $?
      判断上一个命令或脚本的执行成功与否
    • $*
      传递给脚本的所有参数;
    • $@
      传递给脚本的所有参数;
    • $#
      传递给脚本的参数的个数;

    2. Bash的配置文件

    2.1 按生效范围划分

    全局配置:
    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc
    个人配置:
    ~/.bash_profile
    ~/.bashrc

    2.2 按功能划分

    profile类:为交互式登录的shell提供配置

    • 全局:
      /etc/profile
      /etc/profile.d/*.sh
    • 个人:
      ~/.bash_profile
    • 功用:
      (1) 用于定义环境变量
      (2) 运行命令或脚本

    bashrc类:为非交互式登录的shell提供配置

    • 全局:
      /etc/bashrc
    • 个人:
      ~/.bashrc
    • 功用:
      (1) 定义命令别名
      (2) 定义本地变量

    2.3 生效次序

    交互式登录(shell登录)

    • 直接通过终端输入账号密码登录;
    • 使用su - UserNamesu -l UserName切换的用户
    • 生效次序
      /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非交互式登录(shell登录)

    • su UserName
    • 图形界面下打开的终端
    • 执行脚本
    • 生效次序
      ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

    3. Bash中的运算

    3.1 基本算数运算

    算术符号:

    • +
    • -
    • *
    • /
    • %
    • **

    实现算术运算:
    (1) let var=算术表达式
    (2) var=$[算术表达式]
    (3) var=$((算术表达式))
    (4) var=$(expr arg1 arg2 arg3 ...)

    乘法符号有些场景中需要转义
    Bash有内建的随机数生成器:$RANDOM

    3.2 增强型赋值

    算术符号:

    • +=
    • -=
    • *=
    • /=
    • %=

    实现算术运算:
    let varOPERvalue
    例如:let count+=1

    3.3 自增、自减

    自增:
    let var+=1
    let var++

    自减:
    let var-=1
    let var--

    4. 条件测试

    4.1 测试命令

    test EXPRESSION
    [ EXPRESSION ]
    [[ EXPRESSION ]]

    Note: EXPRESSION前后必须有空白字符

    4.2 数值测试

    • -gt
      是否大于
    • -ge
      是否大于等于
    • -eq
      是否等于
    • -ne
      是否不等于
    • -lt
      是否小于
    • -le
      是否小于等于

    4.3 字符串测试

    • ==
      是否等于
    • >

      是否大于

    • <
      是否小于
    • !=
      是否不等于
    • =~
      左侧字符串是否能够被右侧的PATTERN所匹配
      此表达式一般用于[[ ]]中
    • -z "STRING"
      测试字符串是否为空,空则为真,不空则为假
    • -n "STRING"
      测试字符串是否不空,不空则为真,空则为假

    Note:用于字符串比较时的用到的操作数都应该使用引号

    4.4 文件测试

    4.4.1 存在性测试

    • -a FILE
      文件存在性测试,存在为假,否则为真
    • -e FILE
      文件存在性测试,存在为真,否则为假

    4.4.2 存在性及类别测试

    • -b FILE
      是否存在且为块设备文件
    • -c FILE
      是否存在且为字符设备文件
    • -d FILE
      是否存在且为目录文件
    • -f FILE
      是否存在且为普通文件
    • -h FILE-L FILE
      存在且为符号链接文件
    • -p FILE
      是否存在且为命名管道文件
    • -S FILE
      是否存在且为套接字文件

    4.4.3 文件权限测试

    • -r FILE
      是否存在且可读
    • -w FILE
      是否存在且可写
    • -x FILE
      是否存在且可执行

    4.4.4 文件特殊权限测试

    • -g FILE
      是否存在且拥有sgid权限
    • -u FILE
      是否存在且拥有suid权限
    • -k FILE
      是否存在且拥有sticky权限

    4.4.5 文件大小测试

    • -s FILE
      是否存且非空

    4.4.6 文件是否打开

    • -t fd
      fd表示文件描述符是否已经打开且与某终端相关
    • -N FILE
      文件自动上一次被读取之后是否被修改过
    • -O FILE
      当前有效用户是否为文件属主
    • -G FILE
      当前有效用户是否为文件属组

    4.4.7 双目测试

    • FILE1 -ef FILE2
      FILE1与FILE2是否指向同一个设备上的相同inode
    • FILE1 -nt FILE2
      FILE1是否新于FILE2
    • FILE1 -ot FILE2
      FILE1是否旧于FILE2

    4.5 组合测试条件

    第一种方式:
    COMMAND1 && COMMAND2
    COMMAND1 || COMMAND2
    ! COMMAND

    举例:
    1、[ -e FILE ] && [ -r FILE ]

    第二种方式:
    EXPRESSION1 -a EXPRESSION2
    EXPRESSION1 -o EXPRESSION2
    ! EXPRESSION

    举例:
    1、[ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com
    2、[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

    必须使用测试命令进行


    5. 思维导图

    编程入门

    相关文章

      网友评论

        本文标题:Bash脚本编程(2)——编程入门

        本文链接:https://www.haomeiwen.com/subject/tcmdlttx.html