1.环境变量
这种变量中主要保存的是和系统操作环境相关的数据。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
环境变量是 Bash 环境自带的变量,进入 Shell 时已经定义好了,可以直接使用。它们通常是系统定义好的,也可以由用户从父 Shell 传入子 Shell。
1.1 环境变量设置
# 使用export声明的变量即是环境变量 $ export age="18"
1.2 环境变量查询和删除
很多环境变量很少发生变化,而且是只读的,可以视为常量。
env
命令或printenv
命令,可以显示所有环境变量。$ env # 或者 $ printenv
查看单个环境变量的值,可以使用
printenv
命令或echo
命令。$ printenv PATH # 或者 $ echo $PATH
注意,
printenv
命令后面的变量名,不用加前缀$
。env
命令和set
命令的区别:set
命令可以查看所有变量,而env
命令只能查看环境变量。$ unset gender #删除环境变量gender $ env | grep gender
1.3 系统默认环境变量
BASHPID
:Bash 进程的进程 ID。BASHOPTS
:当前 Shell 的参数,可以用shopt
命令修改。DISPLAY
:图形环境的显示器名字,通常是:0
,表示 X Server 的第一个显示器。EDITOR
:默认的文本编辑器。HOME
:用户的主目录。HOST
:当前主机的名称。IFS
:词与词之间的分隔符,默认为空格。LANG
:字符集以及语言编码,比如zh_CN.UTF-8
。PATH
:由冒号分开的目录列表,当输入可执行程序名后,会搜索这个目录列表。PS1
:Shell 提示符。PS2
: 输入多行命令时,次要的 Shell 提示符。PWD
:当前工作目录。RANDOM
:返回一个0到32767之间的随机数。SHELL
:Shell 的名字。SHELLOPTS
:启动当前 Shell 的set
命令的参数,参见《set 命令》一章。TERM
:终端类型名,即终端仿真器所用的协议。UID
:当前用户的 ID 编号。USER
:当前用户的用户名。
2.自定义变量
自定义变量是用户在当前 Shell 里面自己定义的变量,仅在当前 Shell 可用。一旦退出当前 Shell,该变量就不存在了。
2.1 变量定义
$ 2name="abc" -bash: 2name=abc: command not found # 变量名不能用数字开头 $ name = "abc" -bash: name: command not found # 等号左右两侧不能有空格 $ name=ab c -bash: c: command not found # 变量的值如果有空格,必须用引号包含 name="ab c"
2.2 变量调用
# 定义变量name $ name="ab c" # 调用变量使用 $变量名 $ echo $name #输出变量name的值 ab c
2.3 变量查看
set
命令可以显示所有变量(包括环境变量和自定义变量),以及所有的 Bash 函数。$ set [选项] 选项: -u:如果设定此选项,调用未声明变量时会报错(默认无任何提示) -x:如果设定此选项,在命令执行之前,会把命令先输出一次 +<参数> :取消某个set曾启动的参数。
$ set BASH=/bin/bash …省略部分输出… name='ab c' # 直接使用set 命令,会查询系统中所有的变量,包含用户自定义变量和环境变量 # 当设置了-u选项后,如果调用没有设定的变量会有报错。默认是没有任何输出的。 $ set -u $ echo $file -bash: file: unbound variable # 如果设定了-x选项,会在每个命令执行之前,先把命令输出一次 $ set -x $ $ls + ls --color=auto Desktop Documents Downloads Music Pictures projects Public snap Templates Videos # 取消启动的x参数 [root@localhost ~]$ set +x
2.4 变量删除
$ unset 变量名
3.位置参数变量
主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
位置参数变量 | 作用 |
---|---|
$n | n为数字,1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10} |
$* | 这个变量代表命令行中所有的参数,$把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
2 是shell脚本传的第二个参数…
$ vim test.sh #!/bin/sh echo "shell脚本本身的名字: $0" echo "传给shell的第一个参数: $1" echo "传给shell的第二个参数: $2"
保存退出后,在
test.sh
所在的目录下输入 bash test.sh 1 2
结果输出:
shell脚本本身的名字: test.sh 传给shell的第一个参数: 1 传给shell的第二个参数: 2
@则会区分对待接收到的所有参数。举个例子:
$ vi parameter2.sh #!/bin/bash for i in "$*" # 定义for循环,in后面有几个值,for会循环多少次,注意“$*”要用双引号括起来 # 每次循环会把in后面的值赋予变量i # Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo "The parameters is: $i" #打印变量$i的值 done
x=1 # 定义变量x的值为1 for y in"$@" # 同样in后面的有几个值,for循环几次,每次都把值赋予变量y # 可是Shel1中把“$@”中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo "The parameter$x is: $y" #输出变量y的值 x=$(( $x +1 )) #然变量x每次循环都加1,为了输出时看的更清楚 done
4.预定义变量
是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
先来看看
$?
这个变量,举个例子说明$ ls count.sh hello.sh parameter2.sh parameter.sh #ls命令正确执行 $ echo $? 0 #预定义变量“$?”的值是0,证明上一个命令执行正确 $ ls install.log ls:无法访问install.log:没有那个文件或目录 #当前目录中没有install.log文件,所以ls命令报错了 $ echo $? 2 #变量“$?”返回一个非О的值,证明上一个命令没有正确执行 #至于错误的返回值到底是多少,是在编写ls命令时定义好的,如果碰到文件不存在就返回数值2
再来说明下”$$”和”$!”这两个预定义变量
$ vi variable.sh #!/bin/bash echo "The current process is $$" #输出当前进程的PID. #这个PID就是variable.sh这个脚本执行时,生成的进程的PID find /root -name hello.sh & #使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍 echo "The last one Daemon process is $!" #输出这个后台执行命令的进程的PID,也就是输出find命令的PID号
5.总结
变量分类 | 名称 | 作用 | 内容 |
---|---|---|---|
用户自定义变量 | 自定义 | 自定义 | 自定义 |
用户自定义环境变量 | 自定义 | 自定义 | 自定义 |
系统自带环境变量(/etc/profile) | 确定 | 确定 | 自定义 |
位置参数变量 | 确定 | 自定义 | 自定义 |
预定义变量 | 确定 | 自定义 | 自定义 |