• shell编程入门(一)


    运行Linux程序有三种方法:

    (1)、使文件具有可执行权限,直接运行文件。

    (2)、直接调用命令解释器执行程序(Linux shell是一种解释型语言)。

    (3)、使用source执行文件

    第一种:作为可执行程序

    其中第三中运行方式和前两种有所不同。下面我们来看一个程序小栗子,文件名:echo.sh

    #! /bin/sh
    cd tmp
    echo "hello world"

    这是一个完成的,可执行的Linux Shell程序。下面我们来运行这个程序来看看运行结果:

    [root@iZ280zyxdy3Z shTest]# pwd                       # 查看当前工作目录
    /home/jason/shTest                                         #返回当前工作目录
    [root@iZ280zyxdy3Z shTest]# chmod +x echo.sh       #将echo.sh文件权限变为可执行
    [root@iZ280zyxdy3Z shTest]# ./echo.sh                   #运行echo.sh文件
    hello world                                                                 #返回的运行结果
    [root@iZ280zyxdy3Z shTest]# pwd
    /home/jason/shTest                                                  #工作目录没有发生改变
    [root@iZ280zyxdy3Z shTest]# 

    从上面的输出你会看到程序运行了。下面我们来看看这个文件的内容吧,首先是第一行#! /bin/sh

    当命令行执行程序的时候,首先判断程序是否有可执行权限。如果没有足够的权限,机器会告诉用户:“权限不够”。从安全的角度考虑我们也能够了解到,任何程序在机器上运行,首先应该是判断执行这个程序的用户是否有这个权限。在上面三种运行程序的方式中,我们直接执行文件需要文件具有可执行权限。

    其中chmod命令可以修改文件权限,+x参数使可执行文件具有可执行权限。命令行shell接收到我们的执行命令,并且判定我们有可执行权限后,则调用Linux内核命令新建(fork)一个进程。在新建的进程中调用我们的命令。如果这个命令式编译型的(二进制文件),则Linux内核知道怎么去执行文件。可是我们的echo.sh是一个文件文件,而不是二进制文件(编译型的文件)内核并不知道如何运行。内核不知道怎么运行的,但是shell却知道这确实是一个脚本文件,于是shell会启动一个新的shell进程来执行这个程序。由于现在的Linux中用于好几个shell,到底这个程序该选择那个shell呢,这时候#! /bin/sh发挥作用的时候到了,他指定了 shell会创建一个什么样的进程来执行脚本。在本例中我们创建了一个/bin/sh(标准shell)进程来执行脚本。他的执行过程是命令行在扫过第一行,发现#! 之后读取他后面的字符,搜索解释器的完整路径。如果这一行有参数的话也会一起读取。这个程序的运行首先经过第一种判断,如果不是直接可以运行的文件,则会查看是不是第二种运行方式(通过调用命令行解释器),刚好echo.sh文件就是可以通过命令行解释器可以运行。也就是在这三种执行方法中,如果#! 中指定的shell解释器和第二种指定的shell解释器相同的话,这两种的执行结果就是相同的。

    如果你不知道具体的解释器的路径,可以通过whereis查询:
    $>whereis bash
    /bin/bash

    2、作为解释器参数

    这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

    [root@localhost test]# /bin/sh test1.sh 
    test11 for shell!!!

    这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

    3、使用source执行文件

    下面来看看通过第三种方式来执行程序:

    [root@iZ280zyxdy3Z shTest]# pwd                   #查看当前工作目录
    /home/jason/shTest
    [root@iZ280zyxdy3Z shTest]# source echo.sh        #运行echo.sh文件
    hello world
    [root@iZ280zyxdy3Z tmp]# pwd    
    /tmp                                                                  #工作目录改变了
    [root@iZ280zyxdy3Z tmp]# 

    工作目录怎么改变了呢??下面我们来看下是什么原因:

    在解决上面问题之前,先让我们来看看shell的命令种类:

    Linux Shell可执行的命令有三种:内建命令,shell函数和外部命令

    (1))、内建命令就是shell程序本身包含的命令。这些命令集成在shell解释器里面,例如几乎所有的shell命令解释器中都包含cd内建命令来改变工作目录。部分内建命令的存在是为了改变shell本身的属性设置,在执行内建命令的时候没有进程的创建与消亡。另一部分常见的内建命令就是常用的I/O命令,例如:echo

    (2)、Shell函数是一系列程序代码,是shell语言写成。它可以像以他命令一样被引用。

    (3)、外部命令是独立于shell的可执行程序。例如find,grep,echo.sh。命令行shell在执行外部命令的时候,会创建一个当前shell的复制进程来执行。在执行过程中存在进程的创建与消亡。

    外部命令的执行过程如下:

    参考如下:http://www.cnblogs.com/stephen-liu74/archive/2011/12/20/2285454.html

  • 相关阅读:
    CDN缓存
    nginx作用
    Linux下4个查找命令which、whereis、locate、find
    @ModelAttribute的用法,与@RequestBody的区别
    将kafka消息解析拷贝
    永久代溢出(java.lang.OutOfMemoryError: PermGen space )
    失败重试机制-递归应用1
    kafka-重复消费-2
    读写分离-延时问题-1
    UILabel处理html标签
  • 原文地址:https://www.cnblogs.com/duhuo/p/5840870.html
Copyright © 2020-2023  润新知