1. shell脚本的执行
  当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是.bashrc),然后从该环境变量文件开始执行,当读取了ENV文件后,shell才开始执行shell脚本中的内容。
  shell脚本的执行通常可以采用以下三种方式:
    ①. Bash script-name 或sh script-name (推荐使用)
    ②. Path/script-name 或./script-name (当前路径下执行脚本)
    ③. Source script-name 或 .script-name #注意“.”点号。
  执行说明
  第一种方法是当脚本文件本身没有可执行权限(即文件X位为-号)时常使用的方法,这里推荐用bash执行,或者文件开头没有指定解释器
  第二种方法需要先将脚本文件的权限改为可执行(即文件加X位),具体方法:chmod u+x script-name 或 chmod 755 script-name 。然后通过脚本路径就可以直接执行脚本了。
  第三种方法通常是使用 source或者“,”点号读入或加载指定的shelll脚本文件(san.sh),然后,依次执行指定shell脚本文件san.sh中的所有语句。这些语句将作为父shell脚本father.sh进程的一部分运行。因此,使用source或者“.”点号可以将san.sh自身脚本中的变量的值或函数等的返回值传递到当前的父shell脚本father.sh中使用。这是第三种方法和前两种方法的最大区别,也是值得读者注意的地方。
  source或者“."点号命令的功能是在当前shell中执行source或者“.”点号加载并执行的相关脚本文件中的命令及语句,而不是产生一个子shell来执行命令文件中的命令。
  下面我们举例说明:

[root@yanwei-test1 scripts]# cat test.sh
echo 'I am oldboy'

 输入“echo ‘I am oldboy”内容后按回车,然后在按ctrl+d组合建即可结束编程。此操作作为特殊编辑方法,作为cat用法的扩展知识提及(老男孩PS:在使用中去记忆是个好习惯)

[root@yanwei-test1 scripts]# cat test.sh
echo 'I am oldboy'
[root@yanwei-test1 scripts]# sh test.sh #使用第一种方式的sh命令执行test.sh脚本文件
I am oldboy
[root@yanwei-test1 scripts]# bash test.sh #使用第一种方式的sh命令执行test.sh脚本文件
I am oldboy

 我们使用第一种方法,发现均可以执行并得到了预期的结果。

[root@yanwei-test1 scripts]# ./test.sh     #使用第二种方式“./”在当前目录下执行test.sh脚本文件,细心的读者可以发现,这个地方无法自动补全。
-bash: ./test.sh: 权限不够 #提示:权限拒绝,此处因为没有执行权限
[root@yanwei-test1 scripts]# chmod +x test.sh
[root@yanwei-test1 scripts]# ./test.sh
I am oldboy

但是可以用source或者"."点号执行

[root@yanwei-test1 scripts]# . test.sh    #请注意,这里“.”执行,必须有空格
I am oldboy
[root@yanwei-test1 scripts]# source test.sh
I am oldboy

我们看到,给test.sh加完可执行权限就可以执行了
  现在测试第三种方法source或者“.”点号的特殊的传递变量值到当前shell的例子

[root@yanwei-test1 scripts]# echo 'userdir=`pwd`' > testsource.sh #一行的内容通常用echo编辑很方便
[root@yanwei-test1 scripts]# cat testsource.sh
userdir=`pwd`
[root@yanwei-test1 scripts]# sh testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
#此处为空,并没有出现当前路径输出,这是为什么呢?

  根据上面例子,我们可以发现,通过sh或bash命令执行过的脚本,脚本结束后在当前shell窗口查看userdir变量的值,发现值是为空的,现在以同样的步骤改用source执行,然后再看看userdir变量的值。

[root@yanwei-test1 scripts]# source testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
/server/scripts

结论:通过source或“.”点号加载执行过的脚本,在脚本结束后脚本中的变量(包括函数)值在当前shell中依然存在,而sh和bash则不行。因此,在做shell脚本开发时,如果脚本中有需求引用其他脚本的内容或者配置文件时,最好用“.”点号或source在脚本开头加载该脚本或配置文件,然后在下面的内容用可以调用source加载的脚本及文件中的变量及函数等内容。
    某互联网公司linux运维职位实际面试笔试填空题:

已知如下命令及返回结果,请问echo $user的返回的结果为( )
[root@yanwei-test1 scripts]# echo 'user=`whoami`' >whoamisource.sh
[root@yanwei-test1 scripts]# cat whoamisource.sh
user=`whoami`
[root@yanwei-test1 scripts]# sh whoamisource.sh
[root@yanwei-test1 scripts]# echo $user 答案:
1、当前用户
2、空(无内容输出) #这个是正确答案

  

最新文章

  1. iOS开源项目周报1215
  2. Cmd Markdown编辑器简明语法手册
  3. ajax 异步插入图片到数据库(单图上传)
  4. codeforces 489C.Given Length and Sum of Digits... 解题报告
  5. Symfony2学习笔记之数据校验
  6. myeclipse 8.5 破解
  7. php composer
  8. MySQLdb autocommit
  9. 分享最新15个加速 Web 开发的框架和工具(梦想天空)
  10. SharePoint 2013 创建一个搜索中心和搜索设置
  11. Oracle查看表空间大小和使用率
  12. C#删除字符串最后一个字符
  13. 如何用Jupyter notebook打开本地数据集
  14. Caused by: io.protostuff.ProtobufException: Protocol message contained an invalid tag (zero).
  15. Java NIO -- 通道 Channel
  16. Velocity.js初识
  17. MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
  18. linux下使用indent整理代码(代码格式化)【转】
  19. MYSQL用户操作管理大杂烩
  20. 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)

热门文章

  1. java初探(1)之登录初解
  2. github学生认证——申请学生开发包
  3. window下dos命令
  4. 一文带你了解Sql优化
  5. python3 while循环
  6. Linux驱动之设备树的基础知识
  7. centos下安装mongodb和php的mongo扩展
  8. JDK15真的来了,一起来看看它的新特性
  9. 修改ubuntu默认源
  10. 005.操作系统及Linux系统,虚拟机的作用和发展历史