8.7/8.8 shell变量

变量

  • PATH,HOME,PWD,LOGNAME
  • env命令,来获取系统的变量
  • set命令多了不少变量,而且包括用户自定义的变量
  • 自定义变量a=1
  • 变量名规则:字母、数字下划线,首位不能为数字
  • 变量值有特殊符号时须要用单引号括起来
  • 变量的累加
  • 全局变量export b=2
    • 格式 export 变量名=变量值
    • 全局变量仅仅在子shell里面生效
      • 运行bash 命令,直接进去 子shell
  • unset变量 //取消变量

查看环境变量的命令

  • env命令,查看系统经常使用的环境变量
    • 系统的变量都是大写的英文字母,变量的值能够数字,字符串,英文字母等
  • set命令,查看系统内置的环境变量和用户自定义的变量
    • 在centos6中,显示一些环境变量出来或者是显示全部的变量
  • 自定义变量
    • 自定义的变量会在 set 中体现出来
    • set |grep 111 查找变量
[root@localhost ~]# a=111
[root@localhost ~]# echo $a
111
[root@localhost ~]# set |grep 111
_=111
a=111
[root@localhost ~]#
  • set和env命令查看系统变量

变量名规则

  • 变量名规则:
    • 系统的环境变量是系统内置的(通常不会去更改)
    • 自定义的变量的名字:
      • 字母、数字下划线,首位不能为数字
[root@localhost ~]# 
[root@localhost ~]# a1=3
[root@localhost ~]# echo $a1
3
[root@localhost ~]# a_1=2
[root@localhost ~]# echo $a_1
2
[root@localhost ~]# _a1=4
[root@localhost ~]# echo $_a1
4
[root@localhost ~]# 1aa=2   变量名首位不能为数字
-bash: 1aa=2: 未找到命令
[root@localhost ~]#

变量值规则

  • 变量值有特殊符号时须要用单引号括起来
[root@localhost ~]# a='a b c'
[root@localhost ~]# echo $a
a b c
[root@localhost ~]# a="a b c"
[root@localhost ~]# echo $a
a b c
这里可使用 单引号'' 或 双引号"",但使用 单引号 更加好用——>方便脱义
  • 在之后赋值变量,存在特殊符号的时候,使用单引号
    • 不然在使用双引号的时候,赋予的值里面的特殊符号会有可能会系统当作标记
[root@hf-01 ~]# a="a$bc"        //会发现使用双引号,赋值变量得不到想要的结果
[root@hf-01 ~]# echo $a
a
[root@hf-01 ~]# a='a$bc'        //使用单引号会发现正常赋值
[root@hf-01 ~]# echo $a
a$bc

变量的累加

[root@hf-01 ~]# a=1
[root@hf-01 ~]# b=2
[root@hf-01 ~]# echo $a$b        //变量$a=1,变量$b=2
12
[root@hf-01 ~]# a='a$bc'
[root@hf-01 ~]# echo $a$b        //变量$a=a$bc,变量$b=2
a$bc2
[root@hf-01 ~]# c="a$bc"
[root@hf-01 ~]# echo $c        //变量$bc为赋值,因此为空,最后输出的值为a
a
[root@hf-01 ~]# c="a$b"c
[root@hf-01 ~]# echo $c        //变量$b=2,,因此输出为a2c
a2c
如下例子中,$bc为总体,而我又没有给它赋值,因此为空

当变量或表达式较为复杂的时候,变量叠加的时候,可使用双引号将它们标记起来mysql

全局变量

  • 全局变量 export b=2
  • w命令,用于显示已经登录系统的用户列表,并显示用户正在执行的指令

非全局变量

    1. 首先打开两个终端, 终端1 和 终端2
    1. 使用w命令,能够看到有三个用户登陆了系统
[root@hf-01 ~]# w
 05:34:28 up  4:05,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1      01:29    4:04m  0.03s  0.03s -bash
root     pts/0     01:30    4.00s  0.07s  0.03s w
root     pts/1     05:34    5.00s  0.02s  0.02s -bash
    1. 查看在哪一个TTY下(终端下),执行环境变量
    • 在终端1 下执行命令 echo $SSH_TTY
[root@hf-01 ~]# echo $SSH_TTY        //当前是在/dev/pts/0下
/dev/pts/0
- 在终端2下执行命令 echo $SSH_TTY
[root@hf-01 ~]# echo $SSH_TTY
/dev/pts/1
    1. 在终端1 下定义一个变量,并去查看
[root@hf-01 ~]# hanfeng=linux
[root@hf-01 ~]# echo $hanfeng
linux
    1. 在终端2 下去查看终端1 定义的变量,会发现查看不到
[root@hf-01 ~]# echo $hanfeng        //会发现变量为 空

[root@hf-01 ~]#
    1. 在终端1 下,在进入一个子shell
    • shell它是一个进程,打开一个shell,就至关于进入到了另外一个终端,虽然仍是在pts/1上,能够执行pstree 命令查看
[root@hf-01 ~]# bash
[root@hf-01 ~]#
    1. 在终端1下,执行命令 pstree
[root@hf-01 ~]# pstree
systemd─┬─NetworkManager───3*[{NetworkManager}]
        ├─auditd───{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─iprdump
        ├─iprinit
        ├─iprupdate
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld_safe───mysqld───20*[{mysqld}]
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd─┬─bash───bash───pstree
        │             └─bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
[root@hf-01 ~]#
    1. 在终端1下,这时再来执行echo $hanfeng,会发现变量未生效
[root@hf-01 ~]# echo $hanfeng

[root@hf-01 ~]#
这是由于这个变量仅仅在上一个shell中
    1. 在终端1下,退出当前shell,执行命令 exit ,并在此执行pstree命令
[root@hf-01 ~]# exit
exit
[root@hf-01 ~]# pstree
systemd─┬─NetworkManager───3*[{NetworkManager}]
        ├─auditd───{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─iprdump
        ├─iprinit
        ├─iprupdate
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld_safe───mysqld───20*[{mysqld}]
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd─┬─bash───pstree
        │             └─bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
[root@hf-01 ~]#
这时会看到缺乏了一个bash,由于刚exit退出了一个bash
    1. 在终端1下,再去执行echo $hanfeng 会获得自定义的值
[root@hf-01 ~]# echo $hanfeng
linux

这种定义一个变量叫作非全局,或者叫作本地的变量(仅仅在你终端下生效)linux

全局变量

  • export hanfeng=linux //设置全局变量hanfeng=linux
    • 格式:export 变量名=变量值
  1. 在终端1下,设置
[root@hf-01 ~]# export hanfeng=linux
[root@hf-01 ~]# echo $hanfeng
linux
[root@hf-01 ~]# bash
[root@hf-01 ~]# echo $hanfeng
linux
[root@hf-01 ~]#
全局环境变量,在终端1下,在打开shell以后,只要执行export 命令 ,在这下面全部的子shell 都会变量值,但在终端2下,变量依旧是不会生效

全局变量是向下的,在这个shell的基础上生成子shell,子子shell,子子子shell,而不会向上生效

取消变量,unset命令

  • unset命令,取消变量
    • 格式,unset 加变量名称
[root@hf-01 ~]# hanfeng=linux
[root@hf-01 ~]# echo $hanfeng
linux
[root@hf-01 ~]# unset hanfeng
[root@hf-01 ~]# echo $hanfeng

[root@hf-01 ~]#
相关文章
相关标签/搜索