4、Shell脚本的执行方式

打开文本编辑器,这里推荐使用vim编辑器,可以事先做一个别名:

[root@CentOS8 log]# echo "alias vi='vim'" >> /etc/profile
[root@CentOS8 log]# tail -1 /etc/profile
alias vi='vim'
[root@CentOS8 log]# source /etc/profile

新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。

输入一些代码:

#!/bin/bash
echo "Hello World !"

“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。
运行Shell脚本有两种方法。

执行方法

a、方法一:指定bash解释器执行(推荐方法)

bash script-name或sh script-name

b、方法二:全路径或./当前路径下执行

/path/script-name或./script-name

c、方法三:source命令或". "执行(注意.后面有空格)

source script-name或. script-name

三种方法的区别

  • a、方法一指定bash解释器执行时,不需要脚本文件有+x的可执行权限。通过bash解释器,可直接执行。
  • b、方法二全路径或当前路径执行时,脚本文件必须要有+x的可执行权限。
  • c、方法三source命令或". "执行时,不需要脚本文件有+x的可执行权限。
  • d、第三种方法与前2种方法的主要区别:

通过source命令或". "执行时,可以把该脚本中的变量或函数带到当前shell中,也就是会将结果加入当前环境变量中,让当前shell可以正常引用。(可以这样理解:正常的shell脚本执行相当于函数的内部局部变量,函数执行完后,局部变量的作用空间就结束了,而source或". "执行时相当于将局部变量变为了全局变量),在进行Shell脚本开发时,如果脚本中有引用或执行其他脚本的内容或配置文件的需求时,最好用“.”或source先加载改脚本或配置文件,处理完之后,再将他们加载到脚本的下面,就可以调用source加载的脚本及配置文件中的变量及函数等内容了。

所以系统的脚本中全部是用的source命令或". "来执行的

[root@centos8 ~]#cat /etc/init.d/nfs
#!/bin/sh
…
# Source function library.
. /etc/rc.d/init.d/functions

示例

[root@CentOS8 test]# cat test.sh 
user=`whoami`
[root@CentOS8 test]# sh test.sh 
[root@CentOS8 test]# echo $user

[root@CentOS8 test]# sh test.sh && echo $user

[root@CentOS8 test]# 

返回结果为空

因为sh test.sh只是执行了这个文件不会将user引入当前环境变量,只有用点"."或source命令执行过的脚本,在脚本结束后脚本中的变量(包括函数)值在当前shell中依然存在,也就是会将结果加入当前环境变量中,而sh和bash则不行,脚本执行完后变量就丢弃了。本题中sh test.sh执行完后只是把当前用户root赋给了user,并没有把user=root加入到当前环境变量中,所以echo $user的值为空。

如果用. test.sh && echo $user或source test.sh && echo $user来执行,则结果为root。

[root@CentOS8 test]# ls -l test.sh 
-rw-r--r-- 1 root root 14 Aug 21 07:29 test.sh
[root@CentOS8 test]# cat test.sh 
user=`whoami`
[root@CentOS8 test]# source test.sh && echo $user
root
posted @ 2020-08-20 07:12  博小园  阅读(337)  评论(0编辑  收藏  举报
回到顶部