• 十一、变量的高级用法


    1 内部变量

    1.1 BASH

    • 定义

      BASH记录bash shell 的路径,通常为/bin/bash

    • 其他说明

      • 内部变量SHELL就是通过BASH的值确定当前Shell的类型

    1.2 BASH_SUBSHELL

    • 定义

      BASH_SUBSHELL记录了子Shell的层次

    1.3 BASH_VERSINFO

    • 定义

      BASH_VERSINFO是一个数组,包含6哥元素,用于表示bash的版本信息

      BASH_VERSINFO[0]表示bash shell的主版本号
      BASH_VERSINFO[1]表示bash shell的次版本号
      BASH_VERSINFO[2]表示bash shell的补丁级别
      BASH_VERSINFO[3]表示bash shell的编译版本
      BASH_VERSINFO[4]表示bash shell的发行状态
      BASH_VERSINFO[5]表示bash shell的硬件架构
      

    1.4 BASH_VERSION

    • 定义

      linux系统的bash shell版本包含主次版本、补丁级别、编译版本和发行状态,即BASH_VERSINFO数组取值为0~4

    1.5 DIRSTACK

    • 定义

      DIRSTACK记录了栈顶目录值,初值为空

    • 其他

      • pushd命令用于将某目录压入目录栈,同时将当前工作目录切换到入栈的目录

        pushd 目录名
        
      • popd命令将栈顶目录弹出,栈顶元素变为下一个元素,同时将当前工作目录切换到当前栈顶目录

        popd
        
      • dirs命令用于显示目录栈的所有内容

      • pushd和popd命令执行成功将自动激活dirs命令以显示当前目录栈的内容

    1.6 GLOBIGNORE

    • 定义

      GLOBIGNORE是由冒号分隔的模式列表,表示通配(globbing)时忽略的文件名集合

    • 说明

      • 通配是把一个包含通配符的非具体文件名扩展到存储在计算机、服务器或者网络上的一批具体文件名的过程,一旦GLOBIGNORE非空,shell会将通配得到的结果中符合GLOBIGNORE模式中的目录去掉
    • 用法

      ~$: GLOBIGNORE="ar*"  # 在命令行中,通过赋值的方式设定
      

    1.7 GROUPS

    • 定义

      GROUPS是一个数组,数组记录了当前用户所属的所有群组号

    • 说明

      linux管理用户组的文件是/etc/group,每个群组对应该文件中的一行,并用冒号分成四个域

      cat /ect/group   # 群组名:加密后的组命令:群组号:组成员列表
      

    1.8 HOSTNAME

    • 定义

      HOSTNAME记录了主机名

    • 说明

      • 主机名是网络配置时必须要设置的参数
      • /etc/sysconfig/network文件中设置主机名
      • /etc/hosts文件用于设定IP地址和主机名之间的对应关系,以利于快速从主机名查找到IP地址

    1.9 HOSTTYPE和MACHTYPE

    • 定义

      HOSTTYPE和MACHTYPE一样,都用于记录系统的硬件架构,与BASH_VERSINFO[5]等值。

    1.10 OSTYPE

    • 定义

      OSTYPE记录了操作系统类型,即在linux中,$OSTYPE=linux

    1.11 REPLY

    • read命令

      • 定义

        read命令用于读取标准输入(stdin)的变量值

      • 用法

        read variable
        
        • variable是变量名
        • read将读到的标准输入存储到variable变量中
        • read命令不带任何变量名时,则将读到的标准输入存储到REPLY变量中
    • select命令

      • 说明

        select 自动将list形成有编号的菜单,用户输入序号以后,该序号所对应的list中的字符串赋给variable变量,而序号值则保存到REPLY变量中.

    1.12 SECONDS

    • 定义

      SECONDS记录脚本从开始执行到结束所耗费的时间,以秒为单位

    1.13 SHELLOPTS

    • 定义

      SHELLOPTS记录了处于“开”状态的shell选项(options)列表,为一个只读变量,该变量用冒号分隔记录shell选项。

    • 说明

      • shell选项用于改变shell的行为

      • 一个shell选项有"开"和"关"两种状态

      • set命令用于打开或关闭选项:

        set -o optionname # 打开名为optionname选项
        set +o optionname # 关闭名为optionname选项
        

    1.14 SHLVL

    • 定义

      SHLVL记录了bash shell嵌套的层次

    • 说明

      • 当启动第一个shell时,(SHLVL=1,当在这个shell中执行脚本,脚本的)SHLVL=2,一次类推

    1.15 TMOUT

    • 定义

      TMOUT变量用于设置shell的过期时间

    • 说明

      • 当TMOUT不为0时,shell在TMOUT秒后将自动注销
      • TMOUT放在脚本中,可以规定脚本的执行时间

    2 字符串处理

    bash shell提供的多种字符串处理命令,可以归类为两种:

    ​ 1.awk命令

    ​ 2.expr命令

    expr命令,引出通用求值表达式,可以实现算术操作、比较操作、字符串操作和逻辑操作等功能。

    2.1 ${#...}和expr length

    • 定义

      计算字符串长度

    • 用法

      ${#string}
      expr length $string
      
    • 说明

      • (string中包含了空格,如果不用双引号将)string引起,shell认为expr length后面是带了多个参数,而expr length后面只能跟一个参数

    2.2 expr index

    • 定义

      在字符串(string上匹配)substirng中字符第一次出现的位置,若在(string上匹配不到)substring中的任何字符,expr index返回0

    • 语法

      expr index $string $substring
      
    • 说明

      • 当整个(substring不全在)string中时,index不管substring中的字符次序,仍然按照字符在string中的出现位置返回结果

    2.3 expr match

    • 定义
      在字符串string的开头匹配substring字符串,返回匹配到的substring字符串的长度,若string开头匹配不到substring,则返回0

    • 语法

      expr match $string $substring
      
    • 说明

      • substring可以是字符串,也可以是正则表达式

    2.4 抽取字串:#{...}和expr substr

    • #{...}

      • 语法

        (1) #{string:position}  #从名称为$string的字符串的第$position个位置开始抽取子串
        (2) #{string:position:length} #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
        
      • 说明

        • #{...}格式的命令从0开始对名称为$string的字符串进行标号
        • ${string: -position}(position为负数时,表示从)string右边开始计数抽取子串,需要注意的是:冒号与横杠之间一定要有空格
        • ${string:(-position)}表示从$string右边开始计数抽取子串,冒号与横杠之间不需要空格
    • expr substr

      • 语法

        expr substr $string $position $length #表示从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
        
      • 说明

        • expr substr命令从1开始对名称为$string的字符串进行标号
        • expr substr命令中的$length是必不可少的,如果缺少,会报错
    • 其他说明

      使用正则表达式只能抽取$string开头处或结尾处的子串

      • 抽取开头处子串

        expr match $stirng '($substring)'
        expr $string : '($substring)' #冒号前后都有一个空格
        
      • 抽取结尾处子串

        expr match $match '.*($substring)'
        expr $string : '.*($substring)'  #.*可以理解为:任意字符的任意重复
        

    2.5 删除子串

    • 定义

      将原字符串中符合条件的子串删除,格式为${...}

    • 语法

      (1) ${string#substring} #删除string开头处与substring匹配的最短子串
      (2) ${string##substring} #删除string开头处与substring匹配的最长子串
      
      (1) ${string%substring} #删除string结尾处与substring匹配的最短子串
      (2) ${string%%substring} #删除string结尾处与substring匹配的最长子串
      

    2.6 替换子串

    • 定义

      替换子串命令都是${...}格式,可以在任意处(包括开头处和结尾处)替换满足条件的子串

    • 语法

      (1) ${string/substring/replacement} # 仅替换第一次与substring相匹配的子串
      (2) ${string//substring/replacement} # 替换所有与substring相匹配的子串
      (3)${string/#substring/replacement} # 替换string开头处与substring相匹配的子串
      (4)${string/%susbtring/replacement} # 替换string结尾处与substring相匹配的子串
      

    3 有类型变量

    shell变量一般是无类型的,bash shell提供了declare和typeset两个命令用于指定变量的类型,两个变量完全等价

    • 语法

      declare [选项] 变量名
      
    • 选项及其意义

      选项名 意义
      -r 将变量设置为只读属性
      -i 将变量定义为整型数
      -a 将变量定义为数组
      -f 显示此脚本前定义过的所有函数名及其内容
      -F 仅显示此脚本前定义过的所有函数名
      -x 将变量声明为环境变量
    • 双圆括号

      • 作用

        1.shell将双圆括号内的表达式解析为算术运算

        result=$((variable1*variable2))
        

        2.使bash shell实现C语言风格的变量操作

        ((a = 2009)) # 使等号两端各有一个空格
        ((a++)) # 使用自加或自减符号
        # 其他逻辑判断、三元操作符
        
    • declare -x

      • 相当于export命令

      • declare -x允许在声明变量为环境变量的同时给变量赋值,而export命令不支持此功能

        declare -x variable-name=value
        

    4 间接变量引用

    • 定义

      如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用

      variable1=variable2
      variable2=value
      
    • 语法

      (1) eval tempvar=$$variable1
      	echo "$tempvar"
      (2) tempvar=${!variable1}
      
    • 示例

      #! /bin/bash
      
      variable1=variable2
      varibale2=Hadoop
      
      echo "variable1=$variable1"
      
      eval tmpvar=$$variable1
      echo "variable1=$tmpvar"
      
      echo "variable1=${!variable1}"
      

    5 bash数学运算

    • expr命令的操作符及其意义

      操作符 意义
      arg1 | arg2 当arg1不为空且非零时,返回arg1,否则返回arg2
      arg1 & arg2 当arg1不为空且非零时,返回arg1,否则返回0
      arg1 < arg2 当arg1小于arg2时,返回1,否则返回0
      arg1 <= arg2 当arg1小于等于arg2时,返回1,否则返回0
      arg1 > arg2 当arg1大于arg2时,返回1,否则返回0
      arg1 >= arg2 当arg1大于等于arg2时,返回1,否则返回0
      arg1 != arg2 当arg1不等于arg2时,返回1,否则返回0
      arg1 = arg2 当arg1等于arg2时,返回1,否则返回0
      arg1 + arg2 返回arg1和arg2之和
      arg1 - arg2 返回arg1和arg2之差
      arg1 * arg2 返回arg1和arg2之积
      arg1 / arg2 返回arg1除以arg2的商数
      arg1 % arg2 返回arg1除以arg2的余数
    • 说明

      • 当expr命令的操作符是元字符,即该操作符还有其他含义时,需要用专业符将操作符的特殊含义屏蔽,才能使expr成功地执行数学运算

        expr 2020 * 2
        
      • expr操作符两端必须有空格,否则将不执行数学运算

    • bc运算器

      • 定义

        bash shell中最常用的浮点数运算工具

      • bc运算器的操作符及其意义

        操作符 意义
        arg1 + arg2 返回arg1和arg2之和
        arg1 - arg2 返回arg1和arg2之差
        arg1 * arg2 返回arg1和arg2之积
        arg1 / arg2 返回arg1除以arg2的商数
        (按scale变量设定结果的小数位数)
        arg1 % arg2 返回arg1除以arg2的余数
        arg1 ^ arg2 返回arg1的arg2次方,指数运算
        ++arg 或 arg++ 自加操作
        --arg 或 arg-- 自减操作
      • 说明

        • bc运算器定义了内建变量scale用于设定除法运算的精度,默认情况下,scale变量等于0,即除非运算的结果将自动取整

        • bc命令后加上-q选项,使得bc运算器不输出版本信息

          bc -q
          
    • 命令替换

      命令替换可以将bc运算器的结果赋给一个shell变量

      • 语法

        variable='echo "options;expression" | bc'
        
      • 说明

        • variable是变量名
        • echo命令后options部分一般用于设置scale变量
        • expression是数学运算表达式
        • echo的结果通过管道符传输给bc命令,将expression的结果赋给variable变量
      • 示例

        tmpvar='echo "scale=5;12 ^ 2 " | bc'
        
  • 相关阅读:
    前端开发者应该知道的 CSS 小技巧
    css3制作六边形图片
    css3 绘制优惠券
    flex css 布局
    js 微信分享
    JS判断移动设备最佳方法 并实现跳转至手机版网页
    ajax 提交成功页面跳转问题
    css相关tips
    无阻塞加载和defer、async
    常用排序算法
  • 原文地址:https://www.cnblogs.com/nuochengze/p/14534597.html
Copyright © 2020-2023  润新知