`

内部变量简介

阅读更多
    shell 中有很多内建变量,它们会影响到 shell 脚本的行为,所以也有必要知道。
    * BASH:表示 Bash 的二进制程序文件的路径。
    * BASH_ENV:它会指向一个 Bash 的启动文件,该文件会在一个脚本被调用时读取。
    * BASH_SUBSHELL:用来提示子 shell 的层次。
    * BASH_VERSINFO[n]:它包含了安装的 Bash 的版本信息,是一个含有 6 个元素的数组,分别代表:主版本号、次版本号、补丁次数、编译版本、发行状态和结构体系。
    * BASH_VERSION:Bash 的版本号,它与 $BASH_VERSINFO 很像,只是没那么详细。检查该变量对于判断系统上到底运行哪个 shell 来说是一种很好的办法,因为变量 $SHELL 有时候不能给出正确的答案。
    * DIRSTACK:目录栈中最顶端的值。它与 dirs 命令类似,不过 dirs 命令会显示目录栈的整个内容。
    * EDITOR:脚本默认的编辑器。
    * EUID:表示“有效”的用户 ID。
    * FUNCNAME:当前函数的名字。只在函数中有效,超出函数作用域将变为 null。
    * GLOBIGNORE:在进行文件通配查找时要从结果集中去掉的文件模式组成的列表。
    * GROUPS:当前用户所属的组 ID 列表。与 /etc/passwd 中的一样。
    * HOME:用户的 home 目录,一般是 /home/<username>。
    * HOSTNAME:系统主机名。
    * HOSTTYPE:主机类型。如同 $MACHTYPE,用来识别系统硬件。
    * IFS:内部域分隔符,用来决定 Bash 在解释字符串时如何识别域,或者单词边界。默认为空白符(空格、制表符和换行符)。示例如下:
$ v="aa:bb:cc"
$ IFS=":"
$ for a in $v; do echo "[$a]"; done
[aa]
[bb]
[cc]
$ IFS=
$ for a in $v; do echo "[$a]"; done
[aa:bb:cc]
$
$ bash -c 'set w x y-z; IFS=":"; echo "$* -> [$1] [$2] [$3]"'
w:x:y-z -> [w] [x] [y-z]

    * IGNOREEOF:忽略 EOF。告诉 shell 在 log out 之前要忽略多少次文件结束符(Ctrl+D)。
    * LC_COLLATE:用来控制文件名扩展和模式匹配的展开顺序,常在 ~/.bashrc 或 /etc/profile 中设置。文件名匹配在 2.05 版本后的 Bash 中不再区分中括号结构中的字符范围里字符的大小写,比如“ls [A-Z]*”既能匹配 ABc 也能匹配 abc。要使中括号里的字符区分大小写,可以设置该变量为 C。在 /etc/profile 和 ~/.bashrc 中设置“export LC_COLLATE=C”将永久生效。
    * LC_CTYPE:控制通配和模式匹配中的字符串解释。
    * LINENO:记录自身在脚本中所在的行号。一般用于调试目的。
    * MACHTYPE:机器类型。标识系统的硬件。
    * OLDPWD:之前的工作目录。
    * OSTYPE:操作系统类型。
    * PATH:可执行文件的搜索路径。
    * PIPESTATUS:是一个数组变量,依次保存了运行在前台管道中的相应命令的退出状态码,即 ${PIPESTATUS[0]} 保存管道中第一个命令的退出状态码,${PIPESTATUS[1]} 保存第二个命令的退出状态码,依此类推。要注意的是,最后一个运行的管道的退出状态码和最后一个命令运行的退出状态码并不一定相同。
    * PPID:父进程的进程 ID。
    * PROMPT_COMMAND:保存了在主提示符 $PS1 显示之前需要执行的命令。
    * PS1:主提示符。可以在命令行中见到。
    * PS2:第二提示符。当需要额外输入的时候就会看到,默认显示“>”。
    * PS3:第三提示符。在一个 select 循环中显示。
    * PS4:第四提示符。当使用“-x”选项来调用脚本时,该提示符就会出现在每行输出的开头。默认显示“+”。
    * PWD:当前的工作目录。作用同内建命令“pwd”。
    * RANDOM:这实际上是 Bash 的内部函数,它会产生 0 ~ 32767 之间的伪随机数。
    * REPLY:当 read 命令没有指定接收输入的变量时,该变量就会作为默认变量提供给 read。也可以用于 select 菜单,但是只提供所选择变量的编号,而不是变量本身的值。
    * SECONDS:脚本已经运行的秒数。
    * SHELLOPTS:shell 中已经激活的选项的列表。这是一个只读变量。
    * SHLVL:shell 级别,就是 Bash 被嵌套的深度。如果是在命令行中,则其值为 1。在脚本中则为 2。
    * TMOUT:表示在经过 TMOUT 秒后还没有输入,shell 提示符将会超时。类似于 read 命令的“-t”参数。
    * UID:当前的用户 ID,是一个只读变量,和内建的 id 命令很像。
    * $0, $1, $2 等:位置参数。从命令行传递到脚本,或者传递给函数,或者 set 给变量(见上面的 $IFS 变量示例)。
    * $#:命令行参数或者位置参数的个数。
    * "$*":把所有的位置参数都看作为一个单词。使用时一般需要被引用起来,否则会把参数看成单独的单词。
    * "$@":同“$*”,不过把参数列表中的每个参数都看作单独的单词,可迭代读取其中的每个参数。使用时一般也需要被引用起来。另外,shift 命令执行后,“$@”将会保存剩余的位置参数,但是没有之前的“$1”,因为被 shift 丢弃了。“$@”和“$*”中的参数只有在被双引号引用起来的时候才会不同。“$IFS”变量的值也会影响这两个变量的行为,尤其是设置 IFS 为空的时候(IFS=""),不过这种行为可能依赖于所使用的 shell。
    * $-:使用 set 命令设置的脚本标记。
    * $!:运行在后台的最后一个作业的进程 ID。
    * $_:保存之前执行的命令的最后一个参数或命令(没有参数的话)的值。
    * $?:命令、函数,或脚本本身的退出状态码。
    * $$:脚本自身的进程 ID。经常用来构造“唯一的”临时文件名,因为比直接调用 mktemp 命令简单些。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics