什么是Shell 简单来说Shell其实就是一个命令解释器,而它的作用就是解释并执行用户输入的命令及程序。用户每输入一条命令,Shell就解释执行一次。这种方式很容易让大家想起在Windows环境中使用的command命令,我们在cmd窗口输入一条命令,按下Enter键,则执行相应的命令和结果。 Shell位于操作系统的最外层,对外提供与用户交互式的对话并返回相应的执行结果,对内则是将用户输入的命令解释给操作系统。Shell在操作系统中所处的位置如下图所示: ![]()
Shell命令与Command命令对比 ![]() 什么是Shell脚本 在理解了Shell之后,我们再来看看Shell脚本。当命令或程序语句不是在命令行中执行时,而是通过程序文件来执行时,该程序就称之为Shell脚本,我依然拿Windows来做比例。当我们需要执行比较少的命令时,我们可以一个一个命令的进行手动输入,如果需要执行成百上千的命令时,你会怎么办?聪明的你肯定会脱口而出,用批处理(扩展名一般为bat或cmd)。其实Shell脚本就类似于批处理,通过在脚本中定义变量、执行命令、调用函数和逻辑判断、循环等形成一个有机的整体,便形成一个功能强大、自动化程度较高的脚本。
@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
# !/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)三种类型。
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
常用操作系统默认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
Shell 脚本的建立和执行 Shell脚本的建立 在Linux系统中,Shell脚本通常是在编辑器vi/vim中进行编写。可由UNIX/Linux命令、bash shell命令、程序结构控制语句、注释等组成,推荐使用vim。
#!/bin/bash 或 #!/bin/sh 注意事项:
#!/bin/bash echo "bash test" #!/bin/bash #代表该行是注释 #!/bin/sh #代表该行是注释
![]()
一般情况下,安装完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
Shell脚本: bash test.sh或sh test.sh Python脚本:python test.py
在很多编程语言中,都会支持单行和多行注释,方便阅读和维护,在Shell中,使用#对所在行进行注释,注释的内容并不会当作命令执行。注释可单独一行也可以紧跟在命令后面。建议在写脚本添加必要的注释,方便自己也方便后续维护者或使用者。
Shell脚本的执行
![]()
【1】bash script-name或sh script-name 这种方式是当脚本文件本身没有可执行权限(即文件属性没有x占位符)时常使用的方式或脚本文件没有指定解释器时常用的方法。 ![]() 【2】path/script-name或./script-name 这种方式是指在当前路径下执行脚本,前提是脚本必须有可执行权限,具体方法为chmod +x script-name。然后通过相对路径或绝对路径执行脚本。 ![]() 【3】source script-name或. script-name 这种方法通常使用source或" . "读入或加载指定的Shell脚本,如son.sh,然后依次执行指定的Shell脚本文件son.sh中的所有语句。这些语句将在当前父Shell脚本father.sh中运行(其他几种模式都会启动新的进程执行子脚本)。 使用source或" . "可以将son.sh自身脚本中的变量值或函数等的返回值传递到当前父Shell脚本father.sh中使用,这是和其他两种方法最大的区别,因此需要特别注意。 ![]() 【4】sh 这种方法同样适用于bash,这种方法并不常见,了解知道即可。其原理就是利用了管道技术。 ![]()
大家可以看看以下脚本的正确答案是哪一个? ![]() 参考的答案选项如下所示:
通过这个示例我们可以得出如下结论:
![]() 脚本规范 每种语言都有自己的开发规范,虽然不是强制遵守,但有规范的代码不便方便阅读、维护、多人协同开发,同时也能减少出现Bug的概率。主要的规范如下所示:
#!/bin/bash 或 #!/bin/sh
#Date:2017-11-29 22:50 #Author:Surpassme #Description:This is sample shell scripts #Version:1.5
1、成对的符号尽量一次性写全,防止遗漏 2、中括号([])两端至少要保留一个空格。 3、流程控制语句,应一次性将格式写完,再添加内容 4、良好的代码缩进,方便阅读 5、脚本的各个符号必须为英文状态下的符号 6、常规变量的字符串定义时应加双引号("")并且等号前后均不能有空格,需要强引用(指所见即所得的字符串引用),则使用单引号(),如果是命令引用,则用反引号(``) 作者: Surpassme 来源: http://www.jianshu.com/u/28161b7c9995/ |
| 本文出处: https://www.toutiao.com/a6620571117683737091/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|