zoukankan      html  css  js  c++  java
  • shell-脚本的执行

    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、空(无内容输出) #这个是正确答案
    

      

  • 相关阅读:
    wordpress默认css样式class和id集合
    wordpress导航当前页面菜单高亮显示如何操作
    用wpjam插件的朋友记得勾选移除工具栏
    get_template_part()调用自定义模板|wordpress函数
    删除WordPress菜单wp-nav-menu中li的class或id样式
    一行代码搞定WordPress面包屑导航breadcrumb
    wordpress非管理员看不到数据需有manage_options权限
    opencart中文版checkout设置city和county为非必选
    在VS中添加lib库的三种方法
    c++中vector的用法详解
  • 原文地址:https://www.cnblogs.com/scajy/p/12762002.html
Copyright © 2011-2022 走看看