Bash 内置变量
Bash默认建立了许多内置变量,有时候我们碰到一些命令执行的题目时,遇到过滤了小写字母或其他的一些特殊情况,也许能够利用Bash的内置变量来进行构造命令执行。
BASH
用途:显示bash的完整路径名。通常是:/bin/bash
或/usr/local/bin/bash
。
root@ubuntu:~# echo $BASH
/bin/bash
BASH_VERSION
用途:bash的版本。
root@ubuntu:~# echo $BASH_VERSION
4.4.20(1)-release
FUNCNAME
用途:在函数式执行期,此变量内容即为函数式的名称。
root@ubuntu:~# function show_name() {
echo $FUNCNAME
}
root@ubuntu:~# show_name
show_name
HISTCMD
用途:当前指令执行完后,它在历史指令中的排列编号(指定给下一个指令用的历史命令编号)。
root@ubuntu:~# echo $HISTCMD
279
HISTCONTROL
用途:控制指令是否存入历史脚本文件中。
用法:HISTCONTROL有3个可能的设定值:
ignorespace: 凡是指令开头有空格符的,不存入历史脚本文件中。
ignoredups: 连续重复的指令,只存一个。
ignoreboth: 结合前两者的功能。
HISTFILE
用途:设定历史脚本文件的路径文件名。通常是在: 家目录/.bash_history
root@ubuntu:~# echo $HISTFILE
/root/.bash_history
HISTFILESIZE
用途:设定历史脚本文件存储指令的最大行数。
root@ubuntu:~# echo $HISTFILESIZE
2000
HISTIGNORE
用途:不存入历史脚本文件的指令样式,以 : 隔开。
root@ubuntu:~# echo HISTGNORE=ls:cd:type
HOME
用途:设定用户的家目录位置。通常,root的家目录在/root,一般用户的家目录在/home/账号。替换~的结果,就是HOME变量值。
root@ubuntu:~# echo $HOME
/root
HOSTNAME
用途:显示主机名。
root@ubuntu:~# echo $HOSTNAME
ubuntu
HOSTTYPE
用途:显示主机形态。
root@ubuntu:~# echo $HOSTTYPE
x86_64
IFS
用途:定义字段分隔字符。默认值为:空格符、tab字符、换行字符(newline)。
MACHTYPE
用途:描述主机形态的GNU格式:cpu-公司-系统。
root@ubuntu:~# echo $MACHTYPE
x86_64-pc-linux-gnu
用途:显示当前用户邮件目录。
root@ubuntu:~# echo $MAIL
/var/mail/root
MAILCHECK
用途:每隔多久就检查一次邮件。通常默认是60秒。
root@ubuntu:~# echo $MAILCHECK
60
PATH
用途:命令的搜寻路径。
root@ubuntu:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PPID
用途:父进程的进程编号。
root@ubuntu:~# echo $PPID
8910
RANDOM
用途:随机函数。
此变量值,随机出现整数,范围为0-32767。不过,虽然说是随机,但并不是真正的随机,因为每次得到的随机数都一样。为此,在使用RANDOM变量前,请随意设定一个数字给RANDOM,当做随机数种子,这样才不会每次产生的随机数其顺序都一样。
root@ubuntu:~# echo $RANDOM
16191
root@ubuntu:~# echo $RANDOM
24390
root@ubuntu:~# echo $RANDOM
170
REPLY
用途:select和read没有设定读取变量时,默认的变量名称为REPLY。
SHLVL
用途:子shell的层级数。这个东西恒为1.
root@ubuntu:~# echo $SHLVL
1
$1~$n
用途:位置参数。
传入程序或函数式的参数,第一个参数$1,第二参数$2,其他类推。
请注意,若位置参数n超过9以上,则要用${n}来表示。
$0代表执行程序的名称。
root@ubuntu:~# echo $0
-bash
$*
用途:代表所有的位置参数,并且视为一个字符串。
如:test.sh ABC 123 xyz,则$*的内容为字符串“ABC 123 xyz”
$@
用途:代表所有的位置参数,但$@代表各位置参数组成的串行。
如:test.sh ABC 123 xyz,则$@的内容为”ABC”、”123″、” xyz”这3个字符串。
$
用途:位置参数的个数。
如:test.sh ABC 123 xyz,有3个参数,$#的值为3。
$?
用途:上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。
"OS error code 1: Operation not permitted"
"OS error code 2: No such file or directory"
"OS error code 3: No such process"
"OS error code 4: Interrupted system call"
"OS error code 5: Input/output error"
"OS error code 6: No such device or address"
"OS error code 7: Argument list too long"
"OS error code 8: Exec format error"
"OS error code 9: Bad file descriptor"
"OS error code 10: No child processes"
root@ubuntu:~# echo $?
0
root@ubuntu:~# <A
-bash: A: No such file or directory
root@ubuntu:~# echo $?
1
$$
用途:目前bash shell的进程编号。
root@ubuntu:~# echo $$
9011
${#}
用途:返回变量值的长度,不输入变量则为0.
root@ubuntu:~# echo ${#}
0
root@ubuntu:~# echo ${#RANDOM}
5
$_
用途:
a. script执行时,bash的绝对路径。
b. 上一个命令执行时,最后一个位置参数,如上一个命令是:test.sh ABC 123 xyz,则$_的值为’xyz’。
c. 检查邮件时,$_的值为邮件文件名。