shell-script-02 source与export

shell-script-02 source与export

先来看一个脚本,由实例来入手分析

1、查看某一用户是否登录

1)脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#查看某用户是否登录
#语法:user_login loginname

function user_login()
{
if who | grep $1 >/dev/null
then
echo "user $1 is on"
else
echo "user $1 is off"
fi
}

2) >/dev/null(位桶/黑洞)意思是将输出重定向到这个文件夹,不要把信息输出到屏幕;该文件夹用于丢弃不需要的输出流,而读取它时只能读到空。

1
2
3
4
5
[root@localhost ~]# who | grep root
root pts/0 2019-10-01 05:22 (192.168.141.1)
[root@localhost ~]# who | grep root >/dev/null
[root@localhost ~]# cat /dev/null
[root@localhost ~]#

3)if who | grep $1 >/dev/null;意思是判断该用户是否登录,如下命令中,当前root用户是登录状态,故who命令结果中有root这一行,因此返回状态码为0(正确,条件为真);而当前abcdefg用户目前没有登录,故who命令结果中没用abcdefg那一行,因此返回状态码为1(错误,条件为假)。

1
2
3
4
5
6
7
8
[root@localhost ~]# who | grep root
root pts/0 2019-10-01 05:22 (192.168.141.1)
[root@localhost ~]# echo $?
0
[root@localhost ~]# who | grep abcdefg
[root@localhost ~]# echo $?
1
[root@localhost ~]#

注意:shell 语言中 0 代表 true,0 以外的值代表 false。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# vim a.sh
[root@localhost ~]# cat a.sh
#!/bin/bash
if [ 0 ];then
echo "0"
elif [ 1 ];then
echo "1"
else
echo "others"
fi
[root@localhost ~]# . a.sh
0
[root@localhost ~]#

4)总结:条件为真时,输出该用户is on,否则输出该用户is off。

5)执行过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# vim user_login.sh 
[root@localhost ~]# cat user_login.sh
#!/bin/bash
#查看某用户是否登录
#语法:user_login loginname

function user_login()
{
if who | grep $1 >/dev/null
then
echo "user $1 is on"
else
echo "user $1 is off"
fi
}
[root@localhost ~]# source user_login.sh
[root@localhost ~]# user_login root
user root is on
[root@localhost ~]# user_login abc
user abc is off
[root@localhost ~]#

6)注意:source 命令以及脚本的执行方式

  source命令其实是读取脚本里的语句,在当前shell中执行(并未建立新的子shell);使用该命令后,脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

1
2
#例如上面的source user_login.sh,执行之后,user_login()函数就在当前shell中完成了定义;
此时执行命令:user_login root 就相当于执行函数user_login()且其参数为root。

脚本执行方式和区别

Linux执行shell脚本有两种方式,主要区别在于是否建立子shell。

1、不创建子shell

1
2
3
#在当前shell环境下读取并执行filename中的命令,相当于顺序执行filename里面的命令
1)source filename
2). filename

2、创建子shell

1
2
3
4
#在当前bash环境下创建子shell,在子shell中执行filename中的命令
#子shell继承父shell的变量,但子shell不能使用父shell的变量,除非使用export
1)bash filename
2)./filename

3、区别

1)如果你需要再当前shell中使用脚本里的变量,那么就不创建子shell;

2)如果你需要在子shell中使用父shell中的变量,那么就创建子shell且用上export命令;

3)如下,在子shell中不能使用父shell中定义的变量:

1
2
3
4
5
6
7
8
9
[root@localhost ~]# now_date=`date`
[root@localhost ~]# vim test_export.sh
[root@localhost ~]# cat test_export.sh
#!/bin/bash
echo $now_date
[root@localhost ~]# chmod +x test_export.sh
[root@localhost ~]# ./test_export.sh

[root@localhost ~]#

4)如下,在子shell中可以使用父shell中定义的变量,因为加了export:

1
2
3
4
5
6
7
8
[root@localhost ~]# export export_date=`date`
[root@localhost ~]# vim test_export.sh
[root@localhost ~]# cat test_export.sh
#!/bin/bash
echo $export_date
[root@localhost ~]# ./test_export.sh
Tue Oct 1 06:54:14 EDT 2019
[root@localhost ~]#

4、附录

1)子Shell从父Shell继承得来的属性如下:

  • 当前工作目录
  • 环境变量
  • 标准输入、标准输出和标准错误输出
  • 所有已打开的文件标识符
  • 忽略的信号

2)子Shell不能从父Shell继承的属性,归纳如下:

  • 除环境变量和.bashrc文件中定义变量之外的Shell变量
  • 未被忽略的信号处理
欢迎打赏,谢谢
------ 本文结束------
0%