zoukankan      html  css  js  c++  java
  • shell脚本 入门 —— 符号篇

    shell

    1. Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。
    2. Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲 命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,包括循环和分支。但Shell脚本是解释执行的,不需 要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一 行敲到Shell提示符下执行。作为程序设计语言,它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

    Unix系统中常见的shell有:sh、csh、ksh、tcsh、bash

      使用命令: vim   /etc/shells  可以查看当前系统支持的bash

      

    shell执行脚本

    shell执行脚本是一门解释性语言、批量化处理语言,大大的节省了工作成本

    shell脚本第一行必须以 #!开头,它表示该脚本使用后面的解释器解释执行。

    举个栗子:

    //script.sh   注:这是一个文本文件

    #!/bin/bash
    echo "this is a test"
    ls
    ls -l
    echo "there are all files"
    

    执行方式

    //第一种执行方式: 
    [admin@localhost Shell]$ chmod +x  script.sh
    [admin@localhost Shell]$ ./script.sh
    
    //第二种执行方式:
    [admin@localhost Shell]$ /bin/bash  script.sh
    

      

     执行过程:

    Shell会fork一个子进程并调用exec执行./script.sh这个程序,exec系统调用应该把子进程的代码段替换成./script.sh程序的代码段,并从它的_start开始执行。然而script.sh是个文本文件,根 本没有代码段和_start函数,怎么办呢?其实exec还有另外一种机制,如果要执行的是一个文本文件,并且第一行 指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器 的_start开始执行,而这个文本文件被当作命令行参数传给解释器。因此,执行上述脚本相当于执行程序!

    输入命令执行shell脚本后:

    1. 交互式进程(父进程)创建一个子进程用于执行脚本,父进程等待子进程终止
    2. 子进程程序替换bash解释器
    3. 读取shell脚本的命令,将其以参数传递的方式传递给bash解释器
    4. 子bash对shell脚本传入的参数进行读取,读一行识别到它是一个命令,则再创建一个子进程,子bash等待该新进程终止
    5. 新进程执行该命令,执行完后将结果交给子进程
    6. 子进程继续读取命令,创建新进程,新进程执行该命令,将结果返回给子进程,直到执行完最后一条命令
    7. 子进程终止,将结果返回给交互式父进程

    注意:像export、cd、env、set 这些内置命令,在键入命令行后,交互式进程不会创建子进程,而是调用bash内部的函数执行这些命令,改变的是交互式进程。

    如果在命令行下,将多个命令用括号括起来,并用分号隔开来执行,交互式进程依然会创建一个子shell执行括号中的命令:

    如果不加括号则是另一种情况,cd .. 命令会直接在交互式shell下执行:

    . 或者 source这两个命令是Shell的内建命令,这种方式不会创建子Shell,而是直接在交互式Shell下逐行 执行脚本中的命令。

    例证:

    script.sh

    #!/bin/bash
    ls
    echo "#################"
    cd ..
    ls
    

     shell变量

     shell变量不需要进行任何声明,直接定义即可,因为shell变量的值实际上都是字符串(对于没有定义的变量默认是一个空串)。定义的时候shell变量由大写字母加下划线组成,并且定义的时候等号两边不能存在空格,否则会被认为是命令!

    shell变量的种类:

    • 环境变量:shell进程的环境变量可以从当前shell进程传给fork出来的子进程。
    • 本地变量:只存在于当前shell进程

    利用printenv可以显示当前shell进程的环境变量;利用set命令可以显示当前shell进程中的定义的所有变量(包括环境变量和本地变量)和函数。

    一个shell变量定义后仅存在于当前Shell进程,是一个本地变量。用export命令可以把本地变量导出为环境变量。用unset命令可以删除已定义的环境变量或本地变量。

    例如:

    //分步  先定义后导出
    COUNT=5
    export COUNT
    
    //一步完成定义和导出环境变量
    export COUNT=5  
    
    //删除已经定义的环境变量
    unset COUNT
    

     变量引用:

     引用shell变量要用到$符号,加{}可以防止歧义。

    例如:

    COUNT=5
    echo $COUNT
    echo ${COUNT}911
    

      

    通配符 Globbing、命令代换、单引号、双引号

    1.常见的通配符:

    * : 匹配0个或多个任意字符

    ? : 匹配一个任意字符

    [若干字符] : 匹配方括号中任意一个字符的一次出现

    2.命令代换:
    反引号``  或者  $()

    script.sh :

    shell会先执行反引号或$()中的命令,将结果代换到当前命令行中!

    反引号和$()的区别:

        反引号本身就对进行了转义,保留了本身意思,如果我们想在反引号中起到的特殊意义,我们必须使用2个来进行表示。

        反引号中: \ =

        $()中: =

        注意:反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的。

    算数代换$(())

    例如:将2-1的结果赋给SUB,并显示本地变量SUB

    SUB=$((2-1))
    echo $SUB
    

    3.单引号和双引号

    Shell脚本中的单引号和双引号一样都是字符串的界定符,单引号用于保持引号内所有字符的字面值,而双引号有些情况则特殊。如果字符串中有特殊字符需要处理时就用双引号。

    注:单引号标注的字符中不能再出现单引号。

    举个栗子:

    #!/bin/bash
    
    echo '\'
    echo "\"
    echo '`date`'
    echo "`date`"
    

      

  • 相关阅读:
    android图片优化
    Android多线程断点下载的代码流程解析
    文件下载
    图片上传
    DomHelper
    SAX解析类:SaxHelper
    Android开发之画图的实现
    匿名内部类与equals之学习要扎实
    方法构造和方法重载之奥特曼与大boss之战
    排序之那些令人凌乱的那些小程序
  • 原文地址:https://www.cnblogs.com/Lynn-Zhang/p/5758287.html
Copyright © 2011-2022 走看看