shell 变量

1、set 和 env

输入命令 env ,回车,可以获取到一些系统常用的变量信息,见下图,
shell 变量
系统的变量通常都是大写的英文字母,在等号左边,右边是变量的值。
PATH 决定了shell将到哪些目录中寻找命令或程序 HOME 当前用户主目录 HISTSIZE 历史记录数 LOGNAME 当前用户的登录名 HOSTNAME 指主机的名称 SHELL 前用户Shell类型 LANG 语言相关的环境变量,多语言可以修改此环境变量 MAIL 当前用户的邮件存放目录 PWD 当前目录
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。
除了 env 之外,还有一个命令 set ,回车,见下图,
shell 变量
内容较多,不一一截图。set 也可以查看变量,它不仅仅查看系统内置的变量,还可以查看用户自定义的变量。里面的内容是一些 shell 脚本,看不懂没关系,这边可以不用太关注的。

自定义一个变量,见下图,
shell 变量
这个和环境变量不太一样,不是系统内置的,是用户自己定义的变量。可以通过 set 查看,见下图,
shell 变量
觉得结果不太靠谱的话,可以用后面这个命令,搜索查找,输入 /a=1 ,回车,见下图,
shell 变量
可以看到 a=111 ,直接输入 :q ,回车,就可以退出。如果使用 env 的话就看不到了,见下图,
shell 变量

2、变量

系统的环境变量是系统内置的,我们没有权限去干涉,当然可以通过修改配置文件去更改,但是一般情况下我们也不会去更改的。我们可以自定义自己的变量,在写 shell 脚本的时候,经常要使用变量。
先来说说自定义变量的名字,变量名规则:字母、数字、下划线,首位不能为数字。举一些例子,见下图,
shell 变量
变量值有特殊符号时需要用单引号括起来,见下图,
shell 变量
那么双引号可以吗?见下图,
shell 变量
双引号也是可以的,但还是建议使用单引号。为什么呢?再举个例子,见下图,
shell 变量
从上图中可以看出,使用双引号的命令,结果是 a ,没有识别出双引号里面的 $ 。而使用单引号,结果就非常顺利,全部识别出来了。所有还是建议使用单引号。

关于变量的累加,举例子,见下图,
shell 变量
上图打马赛克的位置是,命令手误输错,为了不影响命令的连续性,还是隐藏起来比较好。上图内容,一连串下来,就可以大概了解一下。$a$b表示累加,双引号里面的内容不是赋值,而是区分。当我们赋值的变量表达式比较复杂的时候,尽量用双引号或是单引号区别一下。想保留内容的话,就使用单引号,双引号表示内容的结果。

关于全局变量,见下图例子,
shell 变量
上图使用的是 PuTYY 终端,无法打开多个窗口,所有只有一个 TTY 。如果是 Xshell 上打开了多个窗口,就可以使用命令 echo $SSH_TTY 来查看当前窗口的 TTY 。
现在自定义一个变量,见下图,
shell 变量
在 Xshell 里面的另一个窗口中,输入命令 echo $lys ,结果是空的,表示没有这个变量。
接下来,再进入一个子 shell ,输入命令 bash 。shell 实际上是一个进程,可以再打开一个 shell ,相当于又进入了另外一个终端。虽然当前还是在 pts/0 上,可以使用命令 pstree 来查看,见下图,
shell 变量
上图红色框框的位置就是当前所在的位置,打开一个新的 bash ,并且运行了命令 pstree 。而 Xshell 上的结果不太一样,见下图,
shell 变量
sshd 表示终端,bash 表示进程。
接着上面的操作,这时候输入命令 echo $lys ,结果是空的,表示我们自定义的变量仅仅在它的上一层 bash 中生效,见下图,
shell 变量
使用命令 exit ,可以退出当前的 bash ,返回上一层。可以看到变量 lys 又出现了。
一般我们自定义的变量,仅仅在当前终端,当前 bash 下生效,而且仅此一次,重启系统之后就失效了。那么,我们怎么操作,可以使自定义的变量在全局范围生效?见下图,
shell 变量
export 表示全局环境变量,命令执行完毕之后,后面的子 shell 中,这个自定义变量 lys 都是生效的。再进入一个 bash ,见下图,
shell 变量
也可以看到,变量 lys 生效了。
有一个情况,这边要说明一下,export 适用的环境是当前 sshd 下的往后的所有子 bash ,跟它呈并列关系的其他两个 sshd ,自定义变量是不会生效的。如果是在 sshd 下的 bash 里自定义变量,跟它呈并列关系的其他 bash 里,这个变量也不会生效。
shell 变量
并且在当前 bash 里再往上一层,也不会看到变量。见下图,
shell 变量
说明 export 全局变量指的是向下的,向上是不生效的。后面写 shell 脚本的时候会用到。
变量可以赋值,也可以取消。见下图,
shell 变量
输入命令 unset lys ,就可以取消变量 lys 。

总结:
env 可以查看环境变量,仅限于一些系统内置的常用环境变量。
set 也是查看环境变量,不仅可以查看系统内置的环境变量,还可以查看用户自定义的变量。
变量名规则:字母、数字、下划线,首位不能为数字。
变量值有特殊符号时需要用单引号括起来。
想保留内容的话,就使用单引号,双引号表示内容的结果。
echo $a$b 表示变量 a 和 b 的累加。
echo $SSH_TTY 可以查看当前窗口的 TTY
pstree 可以查看当前位置
bash 可以向下打开一个子 shell
export 表示全局变量,向下生效,向上不生效,并列也不生效。