内部变量是指能够对bash Shell脚本行为产生影响的变量,它们对Shell及其子Shell都有效,因此,内部变量属于环境变量的范畴,在《37 Linux的环境变量》中介绍了Linux的部分环境变量,包括PWD、OLDPWD、PATH、SHELL和USER,可以使用export对其进行设置。
Linux bash shell的内部变量包括如下,可以使用echo + $内部变量名称 来打印输出内部变量的值(以下说明都基于raspbian):
1、BASH记录了bash Shell的路径,通常为/bin/bash,内部变量SHELL就是通过BASH的值确定当前Shell的类型。
alloy@raspberrypi:~$ echo $BASH
/bin/bash
alloy@raspberrypi:~$ echo $SHELL
/bin/bash
2、BASH_SUBSHELL记录了子Shell的层次,这个变量是在bash版本3之后才出现的。
alloy@raspberrypi:~$ echo $BASH_SUBSHELL
0
3、BASH_VERSINFO是一个数组,包含6个元素,这6个元素用于表示bash的版本信息。
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[0]}
4
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[1]}
2
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[2]}
37
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[3]}
1
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[4]}
release
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[5]}
arm-unknown-linux-gnueabihf
或者运行一个基于循环的脚本可以看到如下的输出:
alloy@raspberrypi:~/linuxshell/chapter9$ ./bashver.sh
BASH_VERSINFO[0]=4
BASH_VERSINFO[1]=2
BASH_VERSINFO[2]=37
BASH_VERSINFO[3]=1
BASH_VERSINFO[4]=release
BASH_VERSINFO[5]=arm-unknown-linux-gnueabihf
4、BASH_VERSION是Linux系统的bash Shell版本,包含了主次版本、补丁级别、编译版本和发行状态,即BASH_VERSINFO数组从0到4的值。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $BASH_VERSION
4.2.37(1)-release
5、DIRSTACK是目录栈的栈顶值,初值为空,可以使用pushd和popd来维护目标栈。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $DIRSTACK
~/linuxshell/chapter9
6、GLOBIGNORE是由冒号分隔的模式列表,表示通配(globbing)时忽略的文件名集合。
7、GROUPS记录了当前用户所属的群组,Linux的一个用户可同时包含在多个组内,因此,GROUPS是一个数组,数组记录了当前用户所属的所有群组号,可以参考《32 查看Linux中的的用户组》
alloy@raspberrypi:~/linuxshell/chapter9$ echo $GROUPS
1004
8、HOSTNAME记录了主机名,可以参考《01 修改ubuntu的主机名称解决“sudo 无法解析主机名称”的错误》。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $HOSTNAME
raspberrypi
9、HOSTTYPE和MACHTYPE一样,都用于记录系统的硬件架构,实际上,它们与BASH_VERSINFO[5]也是等值的。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $HOSTTYPE
arm
alloy@raspberrypi:~/linuxshell/chapter9$ echo $MACHTYPE
arm-unknown-linux-gnueabihf
10、OSTYPE记录了操作系统类型。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $OSTYPE
linux-gnueabihf
11、REPLY用于存放read命令从标准输入(stdin)读入的变量数据。
alloy@raspberrypi:~/linuxshell/chapter9$ read
this is a test for REPLY.
alloy@raspberrypi:~/linuxshell/chapter9$ echo $REPLY
this is a test for REPLY.
12、SECONDS记录脚本从开始执行到结束所耗费的时间,以秒为单位。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $SECONDS
1021
13、SHELLOPTS记录了处于“开”状态的Shell选项(options)列表,它是一个只读变量。
14、SHLVL记录了bash Shell嵌套的层次。
15、TMOUT变量用于设置Shell的过期时间。
alloy@raspberrypi:~$ echo $BASH
/bin/bash
alloy@raspberrypi:~$ echo $SHELL
/bin/bash
2、BASH_SUBSHELL记录了子Shell的层次,这个变量是在bash版本3之后才出现的。
alloy@raspberrypi:~$ echo $BASH_SUBSHELL
0
3、BASH_VERSINFO是一个数组,包含6个元素,这6个元素用于表示bash的版本信息。
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[0]}
4
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[1]}
2
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[2]}
37
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[3]}
1
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[4]}
release
alloy@raspberrypi:~$ echo ${BASH_VERSINFO[5]}
arm-unknown-linux-gnueabihf
或者运行一个基于循环的脚本可以看到如下的输出:
alloy@raspberrypi:~/linuxshell/chapter9$ ./bashver.sh
BASH_VERSINFO[0]=4
BASH_VERSINFO[1]=2
BASH_VERSINFO[2]=37
BASH_VERSINFO[3]=1
BASH_VERSINFO[4]=release
BASH_VERSINFO[5]=arm-unknown-linux-gnueabihf
4、BASH_VERSION是Linux系统的bash Shell版本,包含了主次版本、补丁级别、编译版本和发行状态,即BASH_VERSINFO数组从0到4的值。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $BASH_VERSION
4.2.37(1)-release
5、DIRSTACK是目录栈的栈顶值,初值为空,可以使用pushd和popd来维护目标栈。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $DIRSTACK
~/linuxshell/chapter9
6、GLOBIGNORE是由冒号分隔的模式列表,表示通配(globbing)时忽略的文件名集合。
7、GROUPS记录了当前用户所属的群组,Linux的一个用户可同时包含在多个组内,因此,GROUPS是一个数组,数组记录了当前用户所属的所有群组号,可以参考《32 查看Linux中的的用户组》
alloy@raspberrypi:~/linuxshell/chapter9$ echo $GROUPS
1004
8、HOSTNAME记录了主机名,可以参考《01 修改ubuntu的主机名称解决“sudo 无法解析主机名称”的错误》。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $HOSTNAME
raspberrypi
9、HOSTTYPE和MACHTYPE一样,都用于记录系统的硬件架构,实际上,它们与BASH_VERSINFO[5]也是等值的。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $HOSTTYPE
arm
alloy@raspberrypi:~/linuxshell/chapter9$ echo $MACHTYPE
arm-unknown-linux-gnueabihf
10、OSTYPE记录了操作系统类型。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $OSTYPE
linux-gnueabihf
11、REPLY用于存放read命令从标准输入(stdin)读入的变量数据。
alloy@raspberrypi:~/linuxshell/chapter9$ read
this is a test for REPLY.
alloy@raspberrypi:~/linuxshell/chapter9$ echo $REPLY
this is a test for REPLY.
12、SECONDS记录脚本从开始执行到结束所耗费的时间,以秒为单位。
alloy@raspberrypi:~/linuxshell/chapter9$ echo $SECONDS
1021
13、SHELLOPTS记录了处于“开”状态的Shell选项(options)列表,它是一个只读变量。
14、SHLVL记录了bash Shell嵌套的层次。
15、TMOUT变量用于设置Shell的过期时间。