shell简介

  本篇文章是在多个文章中学习复制来的,作为一个总结,是转载,感谢所有参考来源的作者们。


  使用Windows系统的人可能对shell没什么感觉,对于Linux来说,不知道shell可以直接走出开源世界的大门了,这是学习Linux必须要掌握的,否则就是一直停留在学习的表面。下面的内容,多文字预警!!!

什么是Shell

   shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。(充当人机之间的翻译官
   shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。
  不论何时你键入一个命令,它都被Linux shell所解释。一些命令,比如打印当前工作目录命令(pwd),是包含在Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。
  shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,比如ls 和 rm,也可以是购买的商业程序,比如 xv,或者是公用软件(public domain software),就象 ghostview。然后shell试着在搜索路径($PATH)里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。
  shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell 程序设计语言支持在高级语言里所能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。shell 编程语言很易学,并且一旦掌握后它将成为你的得力工具。任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。

shell 如何启动

  shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。你系统上的每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的passwd文件里被指定,该文件的路径是/etc/passwd。passwd文件里还包含有其他东西:每个人的用户ID号,一个口令加密后的拷贝和用户登录后立即执行的程序,(注:为了加强安全性,现在的系统一般都把加密的口令放在另一个文件–shadow中,而passwd中存放口令的部分以一个x字符代替)虽然没有严格规定这个程序必须是某个Linux shell,但大多数情况下都如此。

最常用的shell

  在Linux 和 UNIX系统里可以使用多种不同的shell可以使用。最常用的几种是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三种shell 都有它们的优点和缺点。

  • Bourne shell
      Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 并且在每种 UNIX 上都可以使用。Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。

  • C shell
      C shell 由 Bill Joy 所写,它更多的考虑了用户界面的友好性。它支持象命令补齐(command-line completion)等一些 Bourne shell 所不支持的特性。普遍认为C shell 的编程接口做的不如 Bourne shell, 但 C shell 被很多 C 程序员使用因为 C shell的语法和 C语言的很相似,这也是C shell名称的由来。

  • k shell
      Korn shell (ksh) 由 Dave Korn 所写。它集合了C shell 和 Bourne shell 的优点并且和 Bourne shell 完全兼容。

  • Bourne Again shell (bash)
      Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。为什么要用 bash 来代替 sh 呢?Bourne shell 最大的缺点在于它处理用户的输入方面。在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时。而 bash 准备了几种特性使命令的输入变得更容易。
      bash的优点举例:1.命令补齐(Command-Line Completion);2.命令历史记录;3.输入输出重定向(这是一个很有趣的功能);4.管道;5.提示符;6.作业控制;7.用户化配置bash。

  除了这些 shell 以外,许多其他的 shell 程序吸收了这些原来的 shell 程序的优点而成为新的 shell 。在 Linux 上常见的有 tcsh (csh 的扩展),Bourne Again shell(bash, sh 的扩展), 和Public Domain Korn shell (pdksh, ksh 的扩展)。bash 是大多数Linux 系统的缺省 shell。

shell的案例

  shell本身是人和机器之间的翻译官,这是shell,既然是翻译官,那就不能编程,所以我们通常所说的shell编程指的是shell脚本编程,而不是shell这个翻译官的开发编写。如何完成一个完整的shell程序的编写?

#!/bin/sh、#!/bin/bash

  我们经常见到一个文件的开头就是#!/bin/sh或#!/bin/bash,按照shell编程的规则,#是注释的标识符,既然是注释,那就可有可无,但是,而这里的#!是一个组合,不是单独的#作为注释,"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。(#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径)
  如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell.如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。
  在上面理解了#!/bin/sh就容易理解#!/bin/bash了,#!/bin/sh是指脚本将在默认的shell中执行,#!/bin/bash是指此脚本使用/bin/bash来解释执行。
  #!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,…

  • #!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。
  • #!后面的路径一定要正确,不正确会报错。
  • 如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
  • /bin/sh相当于/bin/bash --posix。

创建test.sh文件

  首先必须明确的是,linux中文件后缀名是什么都不重要,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。Linux不根据扩展名判断文件类型,而是根据文件的内容来判断。所以扩展名的作用是帮助人来识别文件,对于Linux系统本身来说没有什么用处。

创建方式有很多种:

gedit编辑文本的方式

在终端输入:

gedit test.sh

然后打开了文本编辑器,内容如下:
在这里插入图片描述
保存。在终端输入

bash test.sh

运行结果:
在这里插入图片描述

vi/vim创建文本

  vi/vim编辑和保存文本的方法见这里
在终端输入vi test.sh 或者vim test.sh
在这里插入图片描述
此时,该文本是不可编辑的,可以使用i或a命令进入可编辑状态。
然后输入:

#!/bin/bash
player1=xiaoming
player2=dalin
echo "Game Start~ $player1 $player2"

点击Esc,光标转移到倒数第二行,再输入:x 或者:wq
直接保存退出了。同样输入

bash test.sh

运行结果:
在这里插入图片描述

执行

  就像前面所说的使用bash 文件名,为什么需要用bash,是因为该文件没有可执行权限,bash 或者 source就是获可执行权限。

  • 直接输入bash ./test.sh
  • 当然我们也可以手动添加文件的可执行权限,通过输入:
chmod +x ./test.sh
./test.sh

添加执行权限之后,就可以使用./test.sh直接执行了。

  • 第三种运行的方法是直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php

参考链接

感谢原作者们的贡献,笔芯~
https://www.jianshu.com/p/a702a01db5c7
https://www.cnblogs.com/hihtml5/p/9272751.html
https://www.cnblogs.com/fengliu-/p/9999854.html
https://www.runoob.com/linux/linux-shell.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值