热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Shell编程03Shell脚本初步入门

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Shell编程-03-Shell脚本初步入门相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Shell编程-03-Shell脚本初步入门相关的知识,希望对你有一定的参考价值。




什么是Shell

    简单来说Shell其实就是一个命令解释器,而它的作用就是解释并执行用户输入的命令及程序。用户每输入一条命令,Shell就解释执行一次。这种方式很容易让大家想起在Windows环境中使用的command命令,我们在cmd窗口输入一条命令,按下Enter键,则执行相应的命令和结果。
    Shell位于操作系统的最外层,对外提供与用户交互式的对话并返回相应的执行结果,对内则是将用户输入的命令解释给操作系统。Shell在操作系统中所处的位置如下图所示:

Shell编程-03-Shell脚本初步入门



Shell在英文中的意思就是外壳、贝壳等,从图中也可以看出,Shell就像壳一样包住了系统的核心(Kernel)


Shell命令与Command命令对比

Shell编程-03-Shell脚本初步入门


什么是Shell脚本

    在理解了Shell之后,我们再来看看Shell脚本。当命令或程序语句不是在命令行中执行时,而是通过程序文件来执行时,该程序就称之为Shell脚本,我依然拿Windows来做比例。当我们需要执行比较少的命令时,我们可以一个一个命令的进行手动输入,如果需要执行成百上千的命令时,你会怎么办?聪明的你肯定会脱口而出,用批处理(扩展名一般为bat或cmd)。其实Shell脚本就类似于批处理,通过在脚本中定义变量、执行命令、调用函数和逻辑判断、循环等形成一个有机的整体,便形成一个功能强大、自动化程度较高的脚本。



  • 在Windows通过批处理获取系统信息保存为txt文件,而后自动打开该文件,代码如下:

    @echo off
    set date=%date:~0,4%-%date:~5,2%-%date:~8,2%
    echo "当前时间为:"%date%
    cd /d "D:\"
    mkdir SystemInfo
    cd /d "SystemInfo"
    systeminfo>systeminfo%date%.txt
    start systeminfo%date%.txt
    pause


  • Shell脚本判断当前登录用户是否为root

    # !/bin/bash
    currentName=`whoami`
    echo $currentName
    if [ "$currentName" = "root" ]
    then
     echo "Current Login User is root"
    else
    echo "Current Login User is :"$currentName
    fi



Shell脚本语言的种类

    Shell 脚本语言是弱类型语言,即无须定义变量类型即可使用。在UNIX/Linux中主要有两大类Shell:Bourne Shell和C Shell。


Bourne Shell

    Bourne Shell包括Bourne Shell(sh)、Korn Shell(ksh)、Bourne Again Shell(bash)三种类型。



  • Bourne Shell
      由AT&T的Steve Bourne开发,是标准的UNIX Shell,很多UNIX系统都配有sh。


  • Korn Shell(ksh)
      由David Korn开发,是Bournd Shell(sh)的超集合并且添加了csh引入的新功能,是目前很多UNIX系统标配的Shell,这些系统上的/bin/sh往往指向/bin/ksh的符号链接


  • Bourne Again Shell(bash)
      由GNU项目组开发,主要目标是与POSIX标准操持一致,同时兼容sh。bash从csh和ksh借鉴了很多功能,是各种Linux发行版本默认配置的Shell。Linux系统上的/bin/sh往往是指向/bin/bash的符号链接。但bash和sh还是有很多不同之处,虽然bash扩展了一些命令和参数,但bash并不完全兼容sh,两者之间有些行为并不一致。在大多数情况下区别不太大,有时还可以使用bash替代sh。



C Shell

    C Shell包括csh和tcsh两种。csh由Berkeley大学开发,随之BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能,如作业控制、别名、系统算术、命令历史、命令行编辑等。tcsh是csh的增强版,加入了命令补全等功能,在FreeBSD、Mac OS X等系统上代替了csh。
    以上介绍的这些Shell中,较为通用的是标准的Bourne Shell(sh)和C Shell(csh),而其中Bourne Shell(sh)已经被Bourne Again Shell(bash)所取代。可通过以下命令查看CentOS 7.3系统Shell的支持情况。

[admin@CentOS7 tmp]$ cat /etc/shells
/bin/sh             #Linux常用的Shell,指向/bin/bash
/bin/bash           #Linux常用的Shell,也是默认使用的Shell
/sbin/nologin       #Linux常用的Shell,用于禁止用户登录
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh


Linux系统中主流的Shell是bash,而bash是由Bourne Shell(sh)发展而来,同时bash还包含了csh和ksh的特色。因此大多数脚本都可以不做修改即可在sh运行,如果使用sh后结果与预期有差异,可以尝试用bash代替sh.



常用操作系统默认Shell

    在常用的操作系统中,Linux中默认的Shell是Bourne Again Shell(bash),Solaris和FreeBSD下默认的是Bourne Shell(sh),AIX下默认的是Korn Shell(ksh)。那么问题来了,我们该如何查看所使用系统的Shell?以CentOS为例查看系统默认的Shell:



  • 方法一:

    [admin@CentOS7 tmp]$ echo $SHELL
    /bin/bash


  • 方法二:

    [admin@CentOS7 tmp]$ grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin


    root用户结尾的/bin/bash就是用户登录后的Shell解释器。后续文章中重点讲解的是Bourne Again Shell(bash)。




Shell 脚本的建立和执行


Shell脚本的建立

    在Linux系统中,Shell脚本通常是在编辑器vi/vim中进行编写。可由UNIX/Linux命令、bash shell命令、程序结构控制语句、注释等组成,推荐使用vim。



  • Shell脚本开头(第一行)
      一个规范标准的Shell脚本会在第一行指出由哪个解释器来执行脚本中的内容,一般如下所示:

    #!/bin/bash

    #!/bin/sh

    注意事项:



    1、第一行一般要求小于255个字符。
    2、#!/bin/bash不是注释,在执行脚本时,内核会根据#!后的解释器确定使用哪个解释器来执行脚本的内容。
    3、这一行必须位于每个脚本顶端的第一行,如果不是第一行则是代表注释


    #!/bin/bash
    echo "bash test"
    #!/bin/bash #代表该行是注释
    #!/bin/sh   #代表该行是注释


  • bash和sh的区别
      早期的bash与sh稍有不同,bash包含csh和ksh的特色,但大多数的脚本都可以直接在sh上运行。

    Shell编程-03-Shell脚本初步入门




从上图可以看到sh为bash的软链接,大多数情况下,脚本开头使用#!/bin/bash和#!/bin/sh是没有区别的。但还是建议采用#!/bin/bash。


  一般情况下,安装完Linux系统之后会自动安装好bash软件,查看bash版本如下所示:

[admin@CentOS7 etc]$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core) #当前系统版本
[admin@CentOS7 etc]$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu) # bash 版本,后续省略自由软件提示信息

如果想体验更高版本的bash,升级方法如下所示:

yum -y update bash #在线升级
rpm -qa bash  #查看bash安装包
bash-4.2.46-20.el7_2.x86_64

  以下是常用脚本开头的写法,不同语言的脚本在开头一般都要加上如下标识内容:

#!/bin/sh
#!/bin/bash
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcsh
#!/usr/bin/perl


    CentOS中默认的Shell均为bash。因此即在脚本中未加#!/bin/bash,它也会使用bash去解释。如果不希望使用系统默认的Shell解释器,就需要自行指定解释器。建议大家一开始就养成好习惯,遵循Shell编程规范,在开头第一行指定所使用的解释器
    如果在开头未指定解释器,要使用对应的解释器来执行脚本时,可以使用如下方法:


Shell脚本: bash test.sh或sh test.sh
Python脚本:python test.py



  • 脚本注释


    在很多编程语言中,都会支持单行和多行注释,方便阅读和维护,在Shell中,使用#对所在行进行注释,注释的内容并不会当作命令执行。注释可单独一行也可以紧跟在命令后面。建议在写脚本添加必要的注释,方便自己也方便后续维护者或使用者。



注释中尽量不要使用中文,脚本中也尽量不要使用中文。



Shell脚本的执行



  • Shell脚本的执行流程
        当脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell开始执行Shell脚本中的内容。
        Shell脚本执行的顺序是从上到下,从左到右依次执行每一行的命令及语句。如果Shell中存在脚本嵌套(子脚本)时,就会执行嵌套脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令和语句。通常情况下,执行Shell脚本时,会向系统内核启动一个新的进程,以便在该进程中执行脚本的命令和子脚本,其流程图如下所示:Shell编程-03-Shell脚本初步入门


  • Shell脚本的执行方式


【1】bash script-name或sh script-name
    这种方式是当脚本文件本身没有可执行权限(即文件属性没有x占位符)时常使用的方式或脚本文件没有指定解释器时常用的方法。

Shell编程-03-Shell脚本初步入门

【2】path/script-name或./script-name
    这种方式是指在当前路径下执行脚本,前提是脚本必须有可执行权限,具体方法为chmod +x script-name。然后通过相对路径或绝对路径执行脚本。

Shell编程-03-Shell脚本初步入门

【3】source script-name或. script-name
    这种方法通常使用source或” . “读入或加载指定的Shell脚本,如son.sh,然后依次执行指定的Shell脚本文件son.sh中的所有语句。这些语句将在当前父Shell脚本father.sh中运行(其他几种模式都会启动新的进程执行子脚本)。

使用source或" . "可以将son.sh自身脚本中的变量值或函数等的返回值传递到当前父Shell脚本father.sh中使用,这是和其他两种方法最大的区别,因此需要特别注意。

Shell编程-03-Shell脚本初步入门

【4】sh
    这种方法同样适用于bash,这种方法并不常见,了解知道即可。其原理就是利用了管道技术。

Shell编程-03-Shell脚本初步入门



  • 示例


大家可以看看以下脚本的正确答案是哪一个?

Shell编程-03-Shell脚本初步入门

参考的答案选项如下所示:



  • [ ] 当前用户


  • [ ] admin


  • [ ] 无内容输入




正确答案是无内容输入。原因可查看Shell脚本的几种执行方式。


通过这个示例我们可以得出如下结论:



  • 子Shell脚本会直接继承父Shell的变量、函数等,如儿子继承父亲基因。


  • 如果希望父Shell继承子Shell的变量,就要使用source或” . “


Shell编程-03-Shell脚本初步入门


脚本规范

    每种语言都有自己的开发规范,虽然不是强制遵守,但有规范的代码不便方便阅读、维护、多人协同开发,同时也能减少出现Bug的概率。主要的规范如下所示:



  • 【1】Shell脚本的第一行指定脚本解释器

    #!/bin/bash

    #!/bin/sh


  • 【2】Shell脚本的开关添加版本、版权、作者等

    #Date:2017-11-29 22:50
    #Author:Surpassme
    #Description:This is sample shell scripts
    #Version:1.5


  • 【3】Shell脚本中尽量不要使用中文
      虽说Linux也能兼容中文,但还是存在切换系统环境后中文出现乱码的问题。如果非要用中文,可对系统进行字符集调整。如export LANG=”zh_CN.UTF-8”,并在脚本中重新定义字符集设置和系统保持一致。


  • 【4】Shell脚本尽量添加扩展名.sh


  • 【5】养成良好的脚本书写习惯

    1、成对的符号尽量一次性写全,防止遗漏
    2、中括号([])两端至少要保留一个空格。
    3、流程控制语句,应一次性将格式写完,再添加内容
    4、良好的代码缩进,方便阅读
    5、脚本的各个符号必须为英文状态下的符号
    6、常规变量的字符串定义时应加双引号("")并且等号前后均不能有空格,需要强引用(指所见即所得的字符串引用),则使用单引号(''),如果是命令引用,则用反引号(``)


Shell编程-03-Shell脚本初步入门
Shell编程-03-Shell脚本初步入门


推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Linux中执行.sh脚本时出现/bin/sh^M: bad interpreter: No such file or directory异常的原因分析,并提供了两种解决方法:在Windows下进行编码格式转换,或在Linux中修改文件格式和执行权限。具体操作步骤也在摘要中给出。 ... [详细]
  • 怎么解决oracle提示框显示不全问题
    这篇文章主要介绍“怎么解决oracle提示框显示不全问题”,在日常操作中,相信很多人在怎么解决oracle提示框显示不全问题问题上存在疑惑,小编查阅 ... [详细]
author-avatar
小思绪
创造人生的可能
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有