Linux Shell编程(14)——内部变量
内建变量
影响Bash脚本行为的变量。
$BASH
Bash二进制程序文件的路径
bash$ echo $BASH
/bin/bash
$BASH_ENV
该环境变量保存一个Bash启动文件路径,当启动一个脚本程序时会去读该环境变量指定的文件。
$BASH_SUBSHELL
一个指示子shell(subshell)等级的变量。它是Bash版本3新加入的。
$BASH_VERSINFO[n]
这个数组含有6个元素,指示了安装的Bash版本的信息。它和$BASH_VERSION相似,但它们还是有一些小小的不同。
# Bash版本信息:
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done
# BASH_VERSINFO[0] = 3 # 主版本号.
# BASH_VERSINFO[1] = 00 # 次版本号.
# BASH_VERSINFO[2] = 14 # 补丁级.
# BASH_VERSINFO[3] = 1 # 编译版本.
# BASH_VERSINFO[4] = release # 发行状态.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # 结构体系
# (和变量$MACHTYPE相同).
$BASH_VERSION
安装在系统里的Bash版本
检查$BASH_VERSION是检测哪个shell在运行的好办法。$SHELL变量不一定能给出正确的答案。
$DIRSTACK
在目录堆栈里面最顶端的值(它受pushd和popd的控制)
这个内建的变量和dirs命令相符,但dirs是给出整个目录堆栈的内容。
$EDITOR
由脚本调用的默认的编辑器,一般是vi或是emacs.
$EUID
有效用户ID
当前用户无论是什么标识都会被认为是这个有效用户ID,这可能依赖于su.
变量$UID不一定和$EUID相同。
$FUNCNAME
当前函数的名字
$GLOBIGNORE
由通配符(globbing)扩展的一列文件名模式。
$GROUPS
目前用户所属的组
它是当前用户在/etc/passwd文件中记录的所属的组列表(数组)。
$HOME
用户的家目录,通常是/home/username
$HOSTNAME
在系统启动时由一个初始化脚本中用hostname命令给系统指派一个名字。然而,gethostname()函数能设置Bash内部变量E$HOSTNAME。
$HOSTTYPE
机器类型
像$MACHTYPE一样标识系统硬件。
$PPID
一个进程的$PPID变量保存它的父进程的进程ID(pid)。
用这个变量和pidof命令比较。
$PROMPT_COMMAND
这个变量在主提示符前($PS1显示之前)执行它的值里保存的命令。
$PS1
这是主提示符(第一提示符),它能在命令行上看见。
$PS2
副提示符(第二提示符),它在期望有附加的输入时能看见。它显示像">"的提示。
$PS3
第三提示符。它在一个select循环里显示
$PS4
第四提示符,它在用-x选项调用一个脚本时的输出的每一行开头显示。它通常显示像"+"的提示。
$PWD
工作目录(即你现在所处的目录)
它类似于内建命令pwd。
例子:是root吗?
影响Bash脚本行为的变量。
$BASH
Bash二进制程序文件的路径
bash$ echo $BASH
/bin/bash
$BASH_ENV
该环境变量保存一个Bash启动文件路径,当启动一个脚本程序时会去读该环境变量指定的文件。
$BASH_SUBSHELL
一个指示子shell(subshell)等级的变量。它是Bash版本3新加入的。
$BASH_VERSINFO[n]
这个数组含有6个元素,指示了安装的Bash版本的信息。它和$BASH_VERSION相似,但它们还是有一些小小的不同。
# Bash版本信息:
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done
# BASH_VERSINFO[0] = 3 # 主版本号.
# BASH_VERSINFO[1] = 00 # 次版本号.
# BASH_VERSINFO[2] = 14 # 补丁级.
# BASH_VERSINFO[3] = 1 # 编译版本.
# BASH_VERSINFO[4] = release # 发行状态.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # 结构体系
# (和变量$MACHTYPE相同).
$BASH_VERSION
安装在系统里的Bash版本
检查$BASH_VERSION是检测哪个shell在运行的好办法。$SHELL变量不一定能给出正确的答案。
$DIRSTACK
在目录堆栈里面最顶端的值(它受pushd和popd的控制)
这个内建的变量和dirs命令相符,但dirs是给出整个目录堆栈的内容。
$EDITOR
由脚本调用的默认的编辑器,一般是vi或是emacs.
$EUID
有效用户ID
当前用户无论是什么标识都会被认为是这个有效用户ID,这可能依赖于su.
变量$UID不一定和$EUID相同。
$FUNCNAME
当前函数的名字
$GLOBIGNORE
由通配符(globbing)扩展的一列文件名模式。
$GROUPS
目前用户所属的组
它是当前用户在/etc/passwd文件中记录的所属的组列表(数组)。
$HOME
用户的家目录,通常是/home/username
$HOSTNAME
在系统启动时由一个初始化脚本中用hostname命令给系统指派一个名字。然而,gethostname()函数能设置Bash内部变量E$HOSTNAME。
$HOSTTYPE
机器类型
像$MACHTYPE一样标识系统硬件。
$PPID
一个进程的$PPID变量保存它的父进程的进程ID(pid)。
用这个变量和pidof命令比较。
$PROMPT_COMMAND
这个变量在主提示符前($PS1显示之前)执行它的值里保存的命令。
$PS1
这是主提示符(第一提示符),它能在命令行上看见。
$PS2
副提示符(第二提示符),它在期望有附加的输入时能看见。它显示像">"的提示。
$PS3
第三提示符。它在一个select循环里显示
$PS4
第四提示符,它在用-x选项调用一个脚本时的输出的每一行开头显示。它通常显示像"+"的提示。
$PWD
工作目录(即你现在所处的目录)
它类似于内建命令pwd。
例子:是root吗?
#!/bin/bash ROOT_UID=0 # Root的$UID为0. if [ "$UID" -eq "$ROOT_UID" ] # 真正的"root"才能经得住考验 then echo "You are root." else echo "You are just an ordinary user (but mom loves you just the same)." fi exit 0 # ============================================================= # # 下面的代码不会执行,因为脚本在上面已经退出了. # 另外一种判断是否是root用户的方法: ROOTUSER_NAME=root username=`id -nu` # 或者... username=`whoami` if [ "$username" = "$ROOTUSER_NAME" ] then echo "Rooty, toot, toot. You are root." else echo "You are just a regular fella." fi