shell-script-02 source与export
先来看一个脚本,由实例来入手分析
1、查看某一用户是否登录
1)脚本内容
1 | #!/bin/bash |
2) >/dev/null(位桶/黑洞)意思是将输出重定向到这个文件夹,不要把信息输出到屏幕;该文件夹用于丢弃不需要的输出流,而读取它时只能读到空。
1 | [root@localhost ~]# who | grep root |
3)if who | grep $1 >/dev/null;意思是判断该用户是否登录,如下命令中,当前root用户是登录状态,故who命令结果中有root这一行,因此返回状态码为0(正确,条件为真);而当前abcdefg用户目前没有登录,故who命令结果中没用abcdefg那一行,因此返回状态码为1(错误,条件为假)。
1 | [root@localhost ~]# who | grep root |
注意:shell 语言中 0 代表 true,0 以外的值代表 false。
1 | [root@localhost ~]# vim a.sh |
4)总结:条件为真时,输出该用户is on,否则输出该用户is off。
5)执行过程
1 | [root@localhost ~]# vim user_login.sh |
6)注意:source 命令以及脚本的执行方式
source命令其实是读取脚本里的语句,在当前shell中执行(并未建立新的子shell);使用该命令后,脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
1 | #例如上面的source user_login.sh,执行之后,user_login()函数就在当前shell中完成了定义; |
脚本执行方式和区别
Linux执行shell脚本有两种方式,主要区别在于是否建立子shell。
1、不创建子shell
1 | #在当前shell环境下读取并执行filename中的命令,相当于顺序执行filename里面的命令 |
2、创建子shell
1 | #在当前bash环境下创建子shell,在子shell中执行filename中的命令 |
3、区别
1)如果你需要再当前shell中使用脚本里的变量,那么就不创建子shell;
2)如果你需要在子shell中使用父shell中的变量,那么就创建子shell且用上export命令;
3)如下,在子shell中不能使用父shell中定义的变量:
1 | [root@localhost ~]# now_date=`date` |
4)如下,在子shell中可以使用父shell中定义的变量,因为加了export:
1 | [root@localhost ~]# export export_date=`date` |
4、附录
1)子Shell从父Shell继承得来的属性如下:
- 当前工作目录
- 环境变量
- 标准输入、标准输出和标准错误输出
- 所有已打开的文件标识符
- 忽略的信号
2)子Shell不能从父Shell继承的属性,归纳如下:
- 除环境变量和.bashrc文件中定义变量之外的Shell变量
- 未被忽略的信号处理