1.变量分类 - wolai 笔记

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:返回一个032767之间的随机数。
  • 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.位置参数变量

主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
位置参数变量作用
$nn为数字,0表示当前Shell脚本程序的名称,0表示当前 Shell 脚本程序的名称,1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
$*这个变量代表命令行中所有的参数,$把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个变量代表命令行中所有参数的个数
1shell脚本传的第一个参数,1 是shell脚本传的第一个参数,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)确定确定自定义
位置参数变量确定自定义自定义
预定义变量确定自定义自定义

Comment