今天我们来学习shell变量相关的内容。
在实际工作中,无论linux下还是windows下,变量都是实时使用并且相关的。
在linux服务器下,我们查看环境变量或系统变量使用的常用命令:
env或set
env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。
env
或
set
3.1. 来,我们来列举几个shell中常用的系统变量相关内容
$SHELL | 本服务器的默认Shell |
---|---|
$HOME | 当前用户的home目录 |
$LANG | 服务器默认语言 |
$PATH | 默认程序可执行程序路径 |
$PWD | 当前目录 |
$UID | 当前用户ID |
$USER | 当前用户 |
$RANDOM | 随机生成一个0至32767的整数(为什么是这个段位的呢?) |
$HOSTNAME | 主机名 |
我们来分别查看,查看命令形式:echo + 变量。全部执行一遍查看结果,不要手懒!
由于$RANDOM是生成随机数的变量,我多输入了几次,大家可以看到,输出了3个不同的数字。
3.2 普通变量(common variables)与临时环境变量(Temporary Variable)的区别
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
下面看下他们之间区别:
Shell进程的环境变量作用域是Shell进程,也就是当前的shell脚本执行的环境内。当export导入到系统变量时,则作用域是Shell进程及其Shell子进程。
ps axjf输出的第一列是PPID(父进程ID),第二列是PID(子进程ID)
我们来执行下命令看下结果。
所以在当前shell定义的变量一定要export,否则在写脚本时,会引用不到。
还需要注意的是退出终端后,所有用户定义的变量都会清除。
3.3位置变量
位置变量也被称之为位置参数(positional parameters),指的是函数或脚本后跟的第n个参数。
$1-$n:$1表示第1个参数、$2表示第2个参数等,$0为脚本的名字,需要注意:从${10}开始,参数号需要用花括号括起来,如${10}、${11}、${100}、…。$*和$@一样,表示从$1开始的全部参数。
好,我们来编写一个脚本进行测试说明
vi testvar.sh
#!/bin/bash
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
执行脚本:
sh testvar.sh
在上步中,我们执行脚本时未给予参数,下面我们给予参数进行输出内容
sh testvar.sh 1 2 3 4
在执行脚本的时候,var.sh的脚本接受了我们传进去的4个参数,当shell解释一个命令时,会将位置变量与命令行中的每一个参数关联,第一个参数对应的就是"$1",第二个参数对应就是"$2",依次类推。
3.4特殊位置变量(shell脚本中)
$0 | 脚本自身名字(你命名的脚本的名字) |
---|---|
$? | 返回上一条命令是否执行成功,0为执行成功,非0则为执行失败 |
$# | 位置参数总数 |
$* | 所有的位置参数被看做一个字符串 |
$@ | 每个位置参数被看做独立的字符串 |
$$ | 当前进程PID |
$! | 上一条运行后台进程的PID |
3.4.1还是刚才的脚本,我们添加进去$0的内容
vi testvar.sh
#!/bin/bash
echo $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
执行查看结果:
sh testvar.sh 1 2 3 4
3.4.2 其他的变量我们试下一起放入到脚本中,执行看会有什么结果出现。
重新编辑脚本
vi testvar.sh
cho $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
echo "------华丽的分割线——————"
echo "上条命令执行成功了没(成功0,未成功非0) : $?"
echo "参数总数: $#"
echo "所有的位置参数被看做一个字符串 : $*"
echo "每个位置参数被看做独立的字符串 : $@"
echo "当前进程PID : $$"
执行结果:
哦?我们发现好像落掉了一个特殊位置变量,好那我们在加上,为了方便看出对比,我们这回在脚本中又添加了一个变量参数 $5
vi testvar.sh
#!/bin/bash
echo $0
echo "sky : $1"
echo "fans : $2"
echo "NB : $3"
echo "666 : $4"
echo "777 : $5"
echo "------华丽的分割线——————"
echo "上条命令执行成功了没(成功0,未成功非0) : $?"
echo "参数总数: $#"
echo "所有的位置参数被看做一个字符串 : $*"
echo "每个位置参数被看做独立的字符串 : $@"
echo "当前进程PID : $$"
echo "上一条运行后台进程的PID : $!"
执行脚本看结果:
sh testvar.sh
汗!!忘了带参数了,重来!
sh testvar.sh 1 2 3 4 5
注意:给予参数的时候,中间一定要加空格,否则系统会理解为只给了一个参数内容。
sh testvar.sh 12345
这里执行后的结果我们发现没有后台进程的PID,原因是什么?对,就是因为我这里并没有执行后台运行的程序,后台运行的程序需要执行nohup命令。这里我们就不做过多演示!
今天的讲解就到这里!