shell 变量及环境变量配置文件详解

前言

在前面学过一个变量 PATH,它是 shell 预设的一个变量。通常,shell 预设的变量都是大写的。变量就是使用一个较简单的字符串来代替某些具有特殊意义的设定以及数据。PATH 就代替了所有常用命令的绝对路径的设定。有了 PATH 这个变量,我们运行某个命令时,就不再需要输入全局路径,直接输入命令命即可。


  • 使用 echo 显示变量的值
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $LOGNAME
root

  • 命令 env
[root@localhost ~]# env
XDG_SESSION_ID=2
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.56.1 51097 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
。。。。。。。。。
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.56.1 51097 192.168.56.128 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

说明:登录不同的用户,这些环境变量的值也不同。当前显示的是 root 账户的环境变量。
HOSTNAME : 表示主机的名称
SHELL : 表示当前用户的 shell 类型
HISTSIZE : 表示历史记录数
MAIL :表示当前用户的邮件存放目录
PATH :该变量决定了 shell 将到哪些目录中寻找命令或者程序。
LANG :这是与语言相关的环境变量,多语言环境可以修改此环境变量。
PWD : 表示当前目录
HOME :表示当前用户的家目录
LOGNAME :表示当前用户的登录名

env 命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用 set 命令把系统预设的全部变量都显示出来。


自定义变量

[root@localhost ~]# set |grep 1.txt
a=1.txt

变量名规则

字母、数字下划线,首位不能为数字;变量值有特殊符号时需要用单引号括起来(单引号有脱意功能)。


变量累加

[root@localhost ~]# a=123
[root@localhost ~]# b=456
[root@localhost ~]# c="$a$b"789
[root@localhost ~]# echo $c
123456789

说明:当累加的时候只能是双引号。

注意事项

  • 当变量内容带有特殊字符(如空格时),需要加上双引号。如下例子
# myname="DL Li"
# echo $myname
DL Li

  • 当变量内容中本身带有单引号,这时就需要加双引号了,如下例子
# myname="DL 's"
# echo $myname
DL 's

  • 当变量内容中需要用到其他命令,运行结果则可以使用反引号,如下例子
# myname=`pwd`
#echo $myname
/root

  • 当变量中需要累加其他变量内容是,需要加双引号,如下例子
#myname="$LOGNAME"DL
#echo $myname
rootDL

  • 当把双引号错加成单引号时,得不到想要的结果,如下例子
#myname='$LOGNAME'DL
#echo $myname
$LOGNAMEDL

全局变量

export
当在一个父 shell 下设定一个变量后,进入子 shell 该变量并不生效,如果想让该变量在子 shell 下生效需要使用 export 声明一下才可以(跨终端不生效)。
语法: export [变量名] 当 export 不指定变量时,它会声明系统所有变量。

[root@localhost ~]# a=DL
[root@localhost ~]# echo $a
DL
[root@localhost ~]# export a=DL
[root@localhost ~]# echo $a
DL
[root@localhost ~]# bash        //在同一个sshd重新打开一个bash(相当于全局变量)
[root@localhost ~]# echo $a
DL

说明: 当在子 shell 设定变量后即便声明后也不能在父 shell 生效。


  • 查看当前终端
[root@localhost ~]# w
 15:34:47 up  2:18,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      13:17    2:17m  0.04s  0.04s -bash
root     pts/0    192.168.56.1     13:18    7.00s  0.20s  0.00s w
root     pts/1    192.168.56.1     14:55    9:43   0.03s  0.03s -bash
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0

  • 以树状图显示
[root@adai002 ~]# bash[root@adai002 ~]# pstreesystemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─firewalld───{firewalld}
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd─┬─bash───bash───pstree    //可见,在同一个sshd中打开了两个bash。第二个bash相当于子shell
        │             └─bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

  • 删除变量 unset
    语法: unset [变量名],示例如下
[root@localhost ~]# a=12312312
[root@localhost ~]# echo $a
12312312
[root@localhost ~]# unset a
[root@localhost ~]# echo $a

环境变量配置文件

环境变量配置文件分为系统环境变量配置文件用户环境变量配置文件

系统配置文件(严禁改动)

  • /etc/profile 用户环境变量,交互,登录才执行

  • /etc/bashrc 用户不用登录,执行 shell 就生效

用户配置文件

  • .bashrc 该文件主要预设 umask 以及 PS1。这个 PS1 就是我们在输入命令时前面的那串字符。
# echo $PS1
[\u@\h \w]\$

其中,\u 指用户,\h 指主机名,\w 指当前目录,$ 指字符 (如果当前是普通用户,会显示 $)

  • .bash_history 记录命令历史

  • .bash_logout 在此可以设定退出登录时系统执行的操作(如清除缓存、清除历史记录等等)