十一、变量的高级用法

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'
      
原文地址:https://www.cnblogs.com/nuochengze/p/14534597.html