什么是变量

变量就是以一组文字或符号等,来替代一些设置或者是一串保留的数据。

有一些特定的变量会影响到bash的环境,例如,我们能不能在任何目录下执行某个命令与PATH这个变量密切相关,在我们执行一个命令时,系统会通过PATH这个变量中所记录的路径顺序来查找命令。

变量的显示与设置

变量的显示

[root@shadow ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@shadow ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

通过echo这个命令可以显示变量,在变量被显示时,前面必须加上字符“\(”,可以以“\)variable”或“${variable}”的形式显示。

变量的设置

使用“=”连接变量与其内容可以设置变量,例如:

[root@shadow ~]# echo $myvar
			# <== 这里是空行,因为这个变量未被设置,其为空。
[root@shadow ~]# myvar=Hello
[root@shadow ~]# echo $myvar
Hello

变量设置的规则:

  1. 变量与变量的内容以一个等号“=”来连接;
  2. 等号两边不能直接接空格符;
  3. 变量名称只能是英文字母与数字,但开头字符不能是数字;
  4. 变量内容若有空格符可以使用双引号“"”或单引号“''”将变量的内容结合起来;
    需要注意的是,双引号内的特殊字符如$可以保持原本的特性,例如:
[root@shadow ~]# var="lang is $LANG"
[root@shadow ~]# echo $var
lang is en_US.UTF-8

单引号内的特殊字符则为纯文本,例如:

[root@shadow ~]# var='lang is $LANG'
[root@shadow ~]# echo $var 
lang is $LANG
  1. 可以使用转义字符“\”将特殊符号(如$、\、空格符等)编程一般字符;
  2. 在一串命令中,如果还需要通过其他的命令提供信息,可以使用反单引号“`命令`”或者“$(命令)”;例如:
[root@shadow ~]# list=`ls /`

[root@shadow ~]# echo $list 
bin boot dev etc home lib lib64 lost+found media mnt mydata opt proc root run sbin srv sys tmp usr var
[root@shadow ~]# list=$(ls /)
[root@shadow ~]# echo $list 
bin boot dev etc home lib lib64 lost+found media mnt mydata opt proc root run sbin srv sys tmp usr var
  1. 若变量为了增加变量内容,可以使用"\(变量名称"或\){变量}累加内容;
  2. 若变量需要在其他子进程执行,则需要使用expor将变量变为环境变量;
  3. 通常大写字符为系统默认变量,自行设置变量可以使用小写字符;
  4. 取消变量的方法为“unset 变量名称”。例如:
[root@shadow ~]# var=sonmecontent
[root@shadow ~]# echo $var 
sonmecontent
[root@shadow ~]# unset var
[root@shadow ~]# echo $var 
			# <==变量内容为空

环境变量的功能

常见的环境变量

使用env(environment的简写)可以显示出所有的环境变量,export同样也可以显示出所有的环境变量,不过export功能更多。

下面介绍常见的环境变量:

  • HOME
    代表用户的主文件夹目录。
  • SHELL
    表示我们目前这个环境使用的shell是哪个程序。
  • HISTSIZE
    表示系统可以记录的历史命令的条数。
  • MAIL
    在收信时系统去读取的邮件信箱文件。
  • PATH
    执行文件的查找路径,目录与目录中间以冒号“:”分隔,文件的查找是按照PATH的变量里面目录的顺序查找的。
  • LANG
    语系数据,系统按照这个的设置值去分析语系数据文件。
  • RANDOM
    “随机数”的变量,可以通过随机数文件相关的变量($RANDOM)来随机取得随机数值。在bash环境下,只要使用echo $RANDOM这个语句,系统会自动随机选取一个介于0~32767之间的数输出。

set命令

使用set可以显示出所有的变量,包括环境变量与自定义变量,例如:

[root@shadow ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=210
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=shadow
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
JAVA_HOME=/usr/java/jdk-14.0.2
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=46
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=8393
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash

PS1命令提示符

PS1这个变量值规定了显示的提示符内容与格式,主要有以下常用的符号:

  • \d:显示出“星期月日”的日期格式,如“Mon Feb 2”。
  • \H:完整的主机名。
  • \h:仅取主机名在第一个小数点之前的名字。
  • \t:显示时间,为24小时格式的“HH:MM:SS”。
  • \T:显示时间,为12小时格式的“HH:MM:SS”。
  • \A:显示时间,为24小时格式的“HH:MM”。
  • @:显示时间,为12小时格式的“am/pm”。
  • \u:目前用户的账号名称。
  • \v:Bash的版本信息。
  • \w:完整的工作目录名称。
  • \W:利用basename函数取得的工作目录名称,所以仅会李处最后一个目录名。
  • \#:执行的第几个命令。
  • \ $:提示符,如果是root,提示符为#,否则为\$。

例如:

[root@shadow ~]#PS1='[\u@\h \w \A #\#]\$'
[root@shadow ~ 18:59 #41]#

shell的PID

“$”本身就是一个变量,代表当前这个Shell的线程代号,即PID(Process ID)。

上一个执行命令的回传码

“?”也是一个特殊变量,其含义是上一个执行的命令所回传的值,一般来说,如果成功执行该命令,则会回传一个0值;否则则会回传错误代码,即非零值。例如:

[root@shadow ~]#echo $SHELL
/bin/bash
[root@shadow ~]#echo $?
0			# <== 执行正确
[root@shadow ~]#12name=test
-bash: 12name=test: command not found
[root@shadow ~]#echo $?
127			# <== 执行出错

将自定义变量转换为环境变量

环境变量与自定义变量之间的主要区别是该变量是否能够被子进程所继续调用。子进程只会继承父进程的环境变量,不会继承父进程的自定义变量,所以原本bash中的自定义变量在进入子进程后会消失不见,直到重新返回父进程的时候,这些变量才会再出现。

如果想要将自定义变量转换为环境变量,则可以使用“export 变量名称”。

export的另一个功能就是显示所有的环境变量,直接使用“export”就可以。