A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

linux bash变量作用域

一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的?
shell会去$PATH环境变量定义的目录里去找这个命令。环境变量里一般包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin这么多目录,这些目录下又有上千个程序,从这么多目录里的,这么多程序里查找肯定是花费时间的。shell为了提高查找效率,使用了缓存机制,这个机制叫hash。。

有了hash缓存后,shell先去hash里查找,如果找到了,就使用;如果没有找到,才去$PATH环境变量定义的目录里去找,找到后,把命令的路劲加程序名放入hash中。

注意:如果是shell的buildin命令,不会放入hash。

hash命令用法:

查看hash里都缓存了哪些程序:hash

hits:代表此命令,被命中了几次。

# hash
hits    command
   1    /usr/bin/cat
   2    /usr/bin/ls
详细查看hash里都缓存了哪些程序:hash -l

# hash -l
builtin hash -p /usr/bin/cat cat
builtin hash -p /usr/bin/ls ls
清除某个缓存:hash -d cat

# hash -d cat
# hash
hits    command
   2    /usr/bin/ls
清除所有缓存:hash -r

# hash -r
# hash
hash: hash table empty
为什么还要清除缓存?理由:当把命令移动到别的目录后,用原来的缓存就找不到命令了,shell会报出错误,所有要清除。

二,bash变量的作用域
shell进程的子孙进程。

在shell进程里又启动了别的shell进程,下面的例子是在bash里又启动了一个bash,让后在新启动的bash里,又启动了一个csh。

# pstree
systemd─┬
        ├─sshd───sshd───bash───pstree
# bash
# csh
# pstree
systemd─┬
        ├sshd───sshd───bash───bash───csh───pstree
bash变量种类:

按变量的作用域范围分为:

本地变量:作用域仅为当前shell进程

验证本地变量的作用域:

# firstName=jerry
# echo $firstName
jerry
# csh
# echo $firstName
firstName: Undefined variable.
# exit
exit
# echo $firstName
jerry
赋值:name=value

引用:${name},$name

"":变量会被替换成其值
'':变量不会被替换成其值
查看变量:set

撤销变量:unset name。注意name前不要加$

# firstname=tom
# echo $firstname
tom
# unset firstname
# echo $firstname
环境变量:作用域为当前shell进程,及其子孙shell进程。

验证环境变量的作用域:

# fn=tom
# echo $fn
tom
# export fn
# csh
# echo $fn
tom
# exit
exit
# echo $fn
tom
赋值:

export name=value

name=value

export name

declare -x name=value

name=value

declare -x name

引用:同本地变量。

撤销变量:unset name。注意name前不要加$

bash内嵌的环境变量:

PATH,HISTORY,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD

查看环境变量命令:

export,declare -x,printenv,env

只读变量(常量):作用域是当前shell进程,且不可以撤销。随当前shell进程的终止而终止。

declare -r name
readonly name
检证常量的作用域:

# la=foo
# declare -r la
# echo $la
foo
# csh
# $echo la
echo: Undefined variable.
# exit
exit
# echo $la
foo
# la=aa
-bash: la: readonly variable
[root@localhost ~]# unset la
-bash: unset: la: cannot unset: readonly variable
局部变量:函数里的变量,作用域仅为函数内。
位置参数变量:shell脚本的参数

特殊变量:

$?:上一个命令的执行结果。0:成功;1-255:失败。
...
bash里,多个命令一起执行

多个命令连续执行:command1;command2;command3...

这些命令都会被执行。

多个命令逻辑连续执行

根据前面命令的执行结果(成功或者失败),决定是否执行后面的命令。

前一个命令执行成功后,后面的命令才让执行:&&

例子:先查看目录存不存在,存在了才进入此目录

# pwd
/root
# ls /sdf && cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/root
# ls /sdf || cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/tmp
前一个命令执行失败后,后面的命令才让执行:||

例子:先某个用户存不存在,不存在则创建此用户;存在了就不创建了。

# pwd
/root
# ls /sdf || cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/tmp

1 个回复

倒序浏览
有问题欢迎联系学姐
DKA-2018
回复 举报
您需要登录后才可以回帖 登录 | 加入黑马