[Linux]环境变量

三种变量

在 Linux 中,变量依照作用域分为三种,分别是环境变量普通变量导出变量

  • 环境变量可以理解为 Windows 中的环境变量,在任一终端总可以直接访问到。

公共变量被存放在/etc/profile文件中,用户变量被存放在~/.profile中。

cat /etc/profile
  • 普通变量仅在当前进程可用,在子进程中无法访问。

可以通过declare {var}声明变量或使用{var}={value}直接定义。通过echo ${var}查看变量。通过unset {var}释放变量。

declare temp
temp=333
echo $temp
unset temp
  • 导出变量是临时环境变量,即临时导出到环境变量的普通变量。可以通过export {var}对普通变量进行导出,此时其子进程也可以访问该变量。

当前进程结束时,该导出变量一并销毁。

export temp

有三个命令可以查看变量:

set    # 显示所有变量
env    # 显示用户相关的环境变量
export # 显示导出变量

export 变量名=变量值 #申明变量

env# 查询变量

echo $变量名# 变量调用

unset 变量名 #删除变量

pstree 树形显示进程数
#没有这条命令可以执行以下命令下载:
#yum -y install psmisc
#yum provides /命令 查看没有的命令的安装包 配合yum -y install使用

环境变量

定义阐述:环境变量配置文件中,主要是定义对系统的操作环境生效的系统默认环境变量,比如 PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。

以下几个环境变量的配置文件是最主要的:

  • /etc/profile
  • /etc/profile.d/*.sh (指/etc/profile.d/下所有的.sh结尾的文件)
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

环境变量配置文件调用图:

img

这些是在登陆的时候挨个调用,所以在这里面设置环境变量,登陆之后就会自动设置好

  • 登陆输入密码之后,第一步是读取/etc/profile文件
    /etc/profile的作用:
    USER变量
    LOGNAME变量
    MAIL变量
    PATH变量
    HOSTNAME变量
    HISTSIZE变量
    umask
    里面有以上环境变量的配置

  • 接下来便调用/etc/profile.d/ .sh文件*
    然后就是下面的文件,语言包文件,识别系统自带的语言

  • *~/.bash_profile的作用
    调用了~/.bashrc文件。
    在PATH变量后面加入了“:$HOME/bin” 这个目录~/.bashrc的作用
    定义默认别名调用/etc/bashrc

  • /etc/bashrc的作用
    PS1变量
    umask
    PATH变量

  • 调用/etc/profile.d/*.sh文件
    这一块就是进入界面以内,切换shell登陆方式,这种不需要密码,所以和前面的/etc/profile的作用不冲突

变量操作

变量添加:

PATH为例,将某路径添加到PATH环境变量中。

由于PATH变量以:作为分隔符,所以我们应该将:{dir}追加到PATH的末尾。

PATH=$PATH:/home/user/dir

字符串拼接不需要使用+,直接顺着写即可。

注意!!这种方式添加的环境变量是临时的,当关闭终端时失效。

想要让环境变量一直生效,可以让上述命令在终端初始化时执行,终端在初始化时会调用一个脚本,这里使用的是zsh,所以这个脚本位于用户主目录下~/.zshrc

我们可以编辑他,将这条命令添加进去。

echo "PATH=$PATH:/home/user/dir" >> .zshrc

不过对于不同终端,这个初始化脚本也不同,例如bash的初始化脚本是.bashrc

可以通过cat /etc/shells查看已安装的Shell

cat /etc/shells

介绍一个命令echo

echo {string}

echo可以将字符串输出到终端,如果要输出变量,那么变量名前应添加一个$

echo还可以将输出定向至文件:

echo {string} > {filename}
echo {string} >> {filename}

>是直接覆盖文件,>>是追加到文件。

变量修改

变量修改方式 说明
${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

例如,我想将PATH变量中的:/home/user/dir删除:

PATH={PATH%%:/home/user/dir}

执行初始化脚本

更改配置文件后,如果想要立即生效,就要重新执行一遍该脚本。

我们可以使用source命令:

source ./.zshrc

或者直接简写为:

. ./zshrc

变量设置规则

变量设置规则:

  • 变量名称可以由字母、数字和下划线组成 ,但是不能以数字开头。如果变量名是 “2name”则是错误的。
  • 在Bash中,变量的默认类型都是字符串型 ,如果要进行数值运算,则必需指定变量类型为数值型。
  • 默认变量类型全都是字符串型,和其他语言不太一样。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用“\”转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 “ 变量名”或用 变量名”或用 变量名或用{变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量 ,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。

变量的分类:

  • 用户自定义变量
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
  • 位置参数变量:这种变量主要是用来向脚本当 中传递参数或数据的,变量名不能自定义,变量作用是固定的。
  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

变量划分

系统常见环境变量

系统常见环境变量

  • PATH:系统查找命令的路径
    这便是输入命令之前不用输入绝对路径的根本原因,系统会提前在PATH环境变量里的所有路径中查询一遍有没有你输入的命令,找到之后直接执行。

    如果你想直接执行shell脚本,不加绝对路径,直接写入PATH环境变量,使用叠加。

    例子:

    echo $PATH
    PATH="$PATH":/root/sh #PATH变量叠加
    
    

    此后,/root/sh路径里面的执行文件都可以在任意目录下直接执行,不过是临时生效

  • PS1:定义系统提示符的变量 用来改[root@localhost ~]# 这个显示

    下面是系统提示符的变量:

    • \d:显示日期,格式为“星期 月 日”
    • \h:显示简写主机名。如默认主机名“localhost”
    • \t:显示24小时制时间,格式为“HH:MM:SS”
    • \T:显示12小时制时间,格式为“HH:MM:SS”
    • \A:显示24小时制时间,格式为“HH:MM”
    • \u:显示当前用户名
    • \w:显示当前所在目录的完整名称
    • \W:显示当前所在目录的最后一个目录
    • #:执行的第几个命令
    • KaTeX parse error: Expected 'EOF', got '#' at position 23: …是root用户会显示提示符为“#̲”,如果是普通用户 会显示提示…

位置参数变量

在脚本中主要针对参数的一些变量操作。

位置参数 变量 作用
$n n为数字,$0代表命令本身,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一 到第九个参数,十以上的参数需要用大括号 包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}.
$* 这个变量代表命令行中所有的参数,$*把所 有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

举例:

#$n的例子:一个加法器
num1=$1
num2=$2
sum=$(( $num1 + $num2)) #变量sum的和是num1加num2 echo $sum #打印变量sum的值
echo $sum

预定义变量

预定义变量 作用
$? 最后一次执行的命令的返回状态。如果这个变 量的值为0,证明上一个命令正确执行;如果 这个变量的值为非0(具体是哪个数,由命令 自己来决定),则证明上一个命令执行不正确 了。
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
echo “The current process is $$#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理在系统管理章节会详细介绍
echo "The last one Daemon process is $!"

接受键盘输入

read [选项] [变量名]

  • -p “提示信息”:在等待read输入时,输出提示信息
  • -t 秒数: read命令会一直等待用户输入,使用 此选项可以指定等待时间
  • -n 字符数:read命令只接受指定的字符数,就会执行
  • -s: 隐藏输入的数据,适用于机密信息的输入

其他配置文件和登录信息

注销时生效的环境变量配置文件

  • ~/.bash_logout
    注销登陆时写入

其他配置文件

  • ~/bash_history 历史命令文件

Shell登录信息

  • 本地终端欢迎信息: /etc/issue

    转义符 作用
    \d 显示当前系统日期
    \s 显示操作系统名称
    \l 显示登录的终端号,这个比较常用。
    \m 显示硬件体系结构,如i386、i686等
    \n 显示主机名
    \o 显示域名
    \r 显示内核版本
    \t 显示当前系统时间
    \u 显示当前登录用户的序列号
  • 远程终端欢迎信息:/etc/issue.net

    • 转义符在/etc/issue.net文件中不能使用。
    • 是否显示此欢迎信息,由ssh的配置文件 /etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)。
  • 登陆后欢迎信息:/etc/motd
    不管是本地登录,还是远程登录,都可以显示此欢迎信息。

变量运算

declare 声明变量类型

declare [+/-][选项] 变量名

  • -: 给变量设定类型属性
  • +: 取消变量的类型属性
  • -i: 将变量声明为整数型(integer) set-x: 将变量声明为环境变量
  • -p: 显示指定变量的被声明的类型

数值运算

  1. 数值运算
aa=11
bb=22 #给变量aa和bb赋值
declare -i cc=$aa+$bb

  1. expr或let数值运算工具
aa=11
bb=22 #给变量aa和bb赋值
dd=$(expr $aa + $bb)# dd的值是aa和bb的和。注意“+”号左右两 侧必须有空格

let与expr一样。

  1. ( ( 运算式 ) ) ”或“ ((运算式))”或“ ((运算式))[运算式]”
aa=11
bb=22 给变量aa和bb赋值
ff=$(( $aa+$bb ))
gg=$[ $aa+$bb ]

优先级表:

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

变量测试与替换

用来测试一个变量到底有没有设置,测试表:

变变量置换方式 变量y没有设置 变量y为空值 变量y设置值
x= y − 新值 x = 新值 x 为空 x = {y-新值} x=新值 x为空 x= y新值x=新值x为空x=y
x= y : − 新值 x = 新值 x = 新值 x = {y:-新值} x=新值 x=新值 x= y:新值x=新值x=新值x=y
x= y + 新值 x 为空 x = 新值 x = 新值 x = {y+新值} x为空 x=新值 x=新值 x= y+新值x为空x=新值x=新值x={y:+新值} x为空 x为空 x=新值
x= y = 新值 x = 新值 y = 新值 x 为空 y 值不变 x = {y=新值} x=新值 y=新值 x为空 y值不变 x= y=新值x=新值y=新值x为空y值不变x=y y值不变
x= y : = 新值 x = 新值 y = 新值 x = 新值 y = 新值 x = {y:=新值} x=新值 y=新值 x=新值 y=新值 x= y:=新值x=新值y=新值x=新值y=新值x=y y值不变
x= y ? 新值 新值输出到标准错误输出 ( 就是屏幕 ) x 为空 x = {y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x= y?新值新值输出到标准错误输出(就是屏幕)x为空x=y
x= y : ? 新值 新值输出到标准错误输出新值输出到标准错误输 x = {y:?新值} 新值输出到标准错误输出 新值输出到标准错误输 x= y:?新值新值输出到标准错误输出新值输出到标准错误输x=y

例子:
测试x=${y-新值} 测试y变量存不存在

  • unset y 删除变量y
    x=${y-new} 进行测试
    echo $x
    
    

    显示new,y变量不存在
    因为变量y不存在,所以x=new

  • y="" 给变量y赋值为空
    x=${y-new} 进行测试
    echo $x
    
    

    显示空,y为空值

  • y=old 给变量y赋值
    x=${y-new} 进行测试
    echo $x
    
    

    显示old ,y变量存在且有值

    在用到的时候查询就好,不需要死记硬背。这个表是在写脚本的时候给电脑程序看的,人不参与其中

你可能感兴趣的:(linux,运维,服务器)