Bash中定义了大量的内置变量,有些变量颇为有趣,摘录如下:
BASH 和 SHELL 变量记录的是当前shell的路径,linux上通常这两个变量的值都是/bin/bash.
这两者的区别在于,不是所有的shell都有定义 BASH
变量,但一定有定义 SHELL
变量。
另外,当在一个shell中启动另一个shell的时候, SHELL
变量的值不会发生改变,而 BASH
变量的值会发生改变,指向新shell的路径。如下所示:
sh-4.4$ echo $SHELL /bin/bash sh-4.4$ echo $BASH /usr/bin/sh sh-4.4$
该变量定义了一个6元素的数组,用于表示当前bash的版本信息,这六个元素的意义分别为:
- BASH_VERSINFO[0]
- 主版本号
- BASH_VERSINFO[1]
- 次版本号
- BASH_VERSINFO[2]
- 补丁版本
- BASH_VERSINFO[3]
- 编译版本
- BASH_VERSINFO[4]
- 发行状态
- BASH_VERSINFO[5]
- 硬件架构。
当前bash进程的进程号
该数组变量存储的是每个bash调用栈中传递给bash的参数数量。该变量只有在bash开启extdebug选项的情况下才会设置
该数组变量存储的是每个bash调用栈中传递给bash的参数列表。该变量只有在bash开启extdebug选项的情况下才会设置
当前正在(或马上要)执行的命令
bash -c
选项的参数
当前正在执行函数的名称,常用于调试
FUNCNAME 所定义的源文件,其中 ${FUNCNAME[$i]} 定义在 ${BASH_SOURCE[$i]} 文件中
脚本或函数中的当前行号,常用于调试
shell父进程进程号
脚本从运行以来经过的时间(单位为秒)。可用于调试性能。
start=$SECONDS
sleep 2
pass=$(($SECONDS - $start))
echo "$pass seconds passed"
2 seconds passed
冒号分隔的处于开状态的shell选项列表。该变量只能通过 set -o(打开选项)
/ set +o(关闭选项)
来设置。
Shell嵌套的层次,第一个shell的$SHLVL为1,每启动一个bash实例就会+1
终端的宽度
终端的高度
判断bash是否在EMACS中执行,这种情况下bash会禁用行编辑功能
当前用户的有效用户ID,它在shell启动时被设置,之后无法再被修改。
当前用户所属组ID的列表
当前用户ID
当前用名
用户的个人目录地址
当前主机名
当前主机类型
操作系统类型
包含了主机类型和操作系统类型
定义提示符
指定显示时间信息的格式
该值为shell初始化文件的路径,若设置了该值则会执行该值所指定文件内的初始化命令
内建命令fc默认的编辑器
由冒号分隔的后缀名列表,在进行文件名补全时会忽略以这些后缀名结尾的文件名
它是由冒号分隔的模式列表,表示通配时忽略的文件名集合。
内部字段分隔符,影响read命令如何将行进行分成词
设定让bash进入posix mode
用于设置Shell的过期时间,TMOUT不为0时,shell会在TMOUT秒后将自动退出.
同时TMOUT也用于作为read命令的默认超时时间。
它是由冒号分隔的模式列表,表示在$PATH中搜索命令时忽略的文件名集合。
若设置了,则bash在该值所指定的目录下创建临时文件
当使用 =~ 进行正则匹配时,该数组变量存储的是整体或个分组匹配的字符串位置,其中
- ${BASH_REMATCH[0]}
- 整个正则表达式匹配的位置
- n
- 第n个分组匹配的位置
上一次cd的工作目录
当前工作目录
产生一个0-32767之间的随机整数
read命令默认将标准输入存入该变量,select命令也默认将选择的序号存入该变量。
该变量是一个命令,每次现实主提示符之前都会执行该命令。
存放但前目录栈的数组,pushd和popd两个内建命令需要操作该数组,同时也允许手工对该数组内的变量进行赋值从而影响 pushd和popd的行为。
另外,该参数的值可以通过 dirs
命令来显示
用于为bash自定义补全时使用
配置history命令的行为
影响邮件提醒行为