您的位置:首页 > 运维架构 > Shell

Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件

2020-08-09 23:15 801 查看

Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件

上一节,我们对变量有了初步的了解,学会了变量的分类以及各种变量的基本操作和作用。本节我们来了解以下变量运算和运算符、变量测试和内容替换、环境变量配置文件相关内容。

Bash变量的数值运算

变量的数值运算,就是对变量的加减乘除等数学运算。但是,当我们想当然地执行以下“+”操作,会发现根本不能得到正确结果

#省略命令提示符
a=123
b=456
c=$a+$b
echo $c
#得到以下结果
123+456

原来,Bash中的变量默认都是字符串型变量,而Bash又没有其他语言中的隐式变量类型转换,所以不能得到正确结果

那么,如何才能使变量支持数值运算呢?答案是用

declare
命令手动声明变量的类型

 声明变量类型

declare [+/-] [选项] 变量名称
选项/标识 作用
- 给变量设定类型属性
+ 取消变量的类型属性
i integer 声明变量为整数型
x export 声明变量为环境变量
-p 显示指定变量的类型
  • 注意,设定与取消的标识与一般情况相反,
    -
    为设定类型;
    +
    为取消设定
  • 也可以在
    declare
    命令中直接声明一个新的变量并声明其类型

例如,

a=1
declare -i a
declare -p a
declare -i a="1" #此行为上一行查询变量类型的返回值
export a
declare -p a
declare -ix a="1" #此行为上一行查询变量类型的返回值

声明数值类型后,变量就支持数值运算了

 数值运算

  • 已经声明为数值型的变量可以进行数值运算和赋值运算

  • 注意,在给一个新变量赋值之前,必须将该变量声明为数值变量,否则会出现示例中结果

#上文已经声明数值变量a=1,b=2
zheng@Kali:~/Shell$ c=$a+$b
zheng@Kali:~/Shell$ echo $c
1+2

因为未经声明的变量依然默认为字符串型,Shell将后面的值识别成字符串而没有使用数值运算。

而下面的例子中得到了正确结果

zheng@Kali:~/Shell$ declare -i c=$a+$b #同样可以将变量声明与赋值放在一行中
zheng@Kali:~/Shell$ echo $c
3
  • 如果变量未经声明,仍然可以用数值运算工具进行隐式类型转换与数值计算
zheng@Kali:~/Shell$ a=1
zheng@Kali:~/Shell$ b=2
zheng@Kali:~/Shell$ c=$(expr $a + $b)
zheng@Kali:~/Shell$ echo $c
3
zheng@Kali:~/Shell$ declare -p c
declare -- c="3"  #c仍然是一个字符串型变量
  • 在进行expr运算时,用

    $()
    包含值表示将该命令的运算结果而不是其本身赋值给变量

  • 注意,"+"两侧必须存在空格,与变量赋值语句不同,进行数值运算并被赋值的结果变量若不加声明仍是字符串变量

  • 以上的数值运算工具格式上并不符合常用数学格式,不建议使用

  • 下面提供了两种推荐的数值运算符号,

    $(())
    $[]

    #上文声明a=1,b=2,且a b均 不 是数值型变量
    zheng@Kali:~/Shell$ c=$(($a+$b))
    zheng@Kali:~/Shell$ echo $c
    3
    zheng@Kali:~/Shell$ c=$[$a+$b]
    zheng@Kali:~/Shell$ echo $c
    3
    +
    运算符两边的空格可要可不要

 其他运算符

其他运算符以及运算优先级(越大越优先)

优先级 运算符 说明
13 + - 正负 符号运算
12 ! ~ 逻辑非,计算补码(按位取反)
11 * / % 乘、整除、取模
10 + - 加减
9 << >> 按位左移,按位右移
8 <= >= < > 数值大小运算判断
7 == != 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 = 赋值

运算符举例:

zheng@Kali:~/Shell$ echo $[12*3/9+4]
8
zheng@Kali:~/Shell$ echo $[10 << 1]
20 #算术左移一位相当于将原数*2,但运算速度较乘2的幂次快得多
zheng@Kali:~/Shell$ echo $[!(1 && 0)]
1 #1与0为0,取非后为1

若不了解运算相关知识,请自行探索,本文不再赘述

内容替换与变量测试

  内容替换,指用如下方式(目标变量为x,条件变量为y,以

1
代替新值(可以替换,仅作为测试,结果中的
1
也为新值)),替换目标变量(也可能是条件变量)的内容,以新值代替

变量置换方式 y没有设置 y为空 y存在值
x=${y-1} x=1 x为空 x=$y
x=${y:-1} x=1 x=1 x=$y
x=${y+1} x为空 x=1 x=1
x=${y:+1} x为空 x为空 x=1
x=${y=1} x=1 y=1 x为空 y值不变 x=$y y值不变
x=${y:=1} x=1 y=1 x=1 y=1 x=$y y值不变
x=${y?1} 新值输出到标准错误输出 x为空 x=$y
x=${y:?1} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y
  • 上表中语句逻辑较混乱,内容较多,仅作为了解即可,必要使用时可作参考

  变量置换的不同结果可用于判断条件变量是否存在以及是否为空,即在不使用echo命令输出在显示器上手动查看变量的情况下测试变量,此即变量测试

环境变量配置文件

 环境变量配置文件简介

  • 环境变量配置文件是系统配置文件,主要定义了对操作系统环境永久生效(可修改)的系统默认环境变量
  • 环境变量配置文件中包含的主要环境变量:
    PATH
    HISTSIZE
    (历史命令保存数量)
    PS1
    HOSTNAME

说到配置文件,首先介绍

source
命令,可使配置文件立即生效,免去了重新登录的麻烦

source [filename]
#例如,以下命令使对.bashrc(Bash配置文件)的修改立刻生效
source ~/.bashrc

主要的环境变量配置文件

环境变量配置文件 说明
/etc/profile 全局环境变量设定文件,系统级初始化
/etc/profile.d/*.sh /etc/profile文件的拓展文件夹,其中内容与该文件效用相同
~/.bash_profile 对单个用户有效的Bash初始化文件
~/.bashrc 对单个用户生效的Bash启动配置文件
/etc/bash.bashrc 对系统中所有用户都生效的Bash启动配置文件

 环境变量配置文件作用

环境变量配置文件调用顺序(调用顺序对环境变量定义可能产生影响,后调用并定义的环境变量配置可能覆盖前面定义的

以上文件在登录时进行读取初始化,将其中的环境变量读入内存中

  • /etc/profile

    定义环境变量
    USER
    LOGNAME
    MAIL
    PATH
    HOSTNAME
    HISTSIZE
    UMASK
  • 调用
    ./profile.d
    目录,读取其中内容
  • ~/.bash_profile
    (可能不存在,功能被整合入
    ~/.bashrc

      调用
      ./.bashrc
      文件
    • 在PATH变量后加入":$HOME/bin"目录
  • /etc/bash.bashrc

      定义环境变量
      PS1
    • 对于无登录用户,此文件中设置生效

    环境变量配置文件的作用在不同发行版的 linux 系统中有部分不同,请注意区分

    其他配置文件和登录信息

     其他配置文件

     登录信息

    • 在用户登录时会显示的登录提示信息,本地用户登录信息的设置在配置文件

      /etc/issue

      这个文件支持转义符使用

    转义符 作用
    \d 显示当前系统日期
    \s 显示操作系统名称
    \l 显示登录的终端号
    \m 显示硬件架构
    \n 显示主机名
    \o 显示域名
    \r 显示内核版本
    \t 显示系统时间
    \u 显示当前登录的用户ID
    • 对于远程登录的用户的欢迎信息在

      /etc/issue.net
      中(具体文件名称也可以配置修改)

      这个文件不允许使用转义符,且在ssh登录中默认不会显示,要在ssh登录配置文件

      /etc/ssh/sshd_config
      中设置

      #这是原文件中的其中一行内容
      #Banner no
      #将其换为(或直接增加一行)
      Banner /etc/issue.net
      #文件名称可以在这里修改
    • 登录以后(输入密码成功登录),会显示另一个欢迎信息,本地登录和远程登录都会出现,配置文件在

      /etc/motd

    下一节,Linux Bash Shell编程(六):正则表达式 基本元字符应用示例 我们将了解正则表达式的基本用法
    上一节,Linux Bash Shell编程(四):变量(上) 变量分类与相关操作

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐