Shell 概述

返回主页

一、前言

计算机只能认识(识别)机器语言(01),如 (10111010101这种)。但是,我们的 “程序猿” 们不能直接去写01这样的代码,所以,要想将 “程序猿” 所编写的代码在计算机上运行,就必须找 “人”(工具)来翻译成机器语言,这个 “人”(工具)就是我们常常所说的编译器或者解释器

Shell 介绍

二、编程语言分类

  • 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。比如:C、C++ 、C# 。

  • 解释型语言:程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次,不生成目标文件。因此效率比较低。比如:Python 、JavaScript 、Shell 等都是解释型语言。

总结:
编译型语言比解释型语言速度较快,但是不如解释型语言跨平台性好。如果做底层开发或者大型应用程序或者操作系开发一般都用编译型语言;如果是一些服务器脚本及一些辅助的接口,对速度要求不高、对各个平台的兼容性有要求的话则一般都用解释型语言。

三、Shell简介

Shell 介于内核与用户之间,负责命令的解释。如下图所示:

Shell 介绍

Shell 是一个命令行解释器,它是用户与操作系统进行交互的接口。用户通过 Shell 输入命令,Shell 解释命令并调用相应的程序来执行。Shell 是操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果再输出到屏幕或返回给用户,起到了一个“命令解释器”的作用。它接收用户输入的命令(如 ls 等)并把它送入内核去执行。

Shell 既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

Shell 脚本语言就是基于 Shell 的命令语言,为了简化管理过程,管理员可以通过编写 Shell 脚本来实现系统日常的管理工作,简化操作流程,提高工作效率。

总结:Shell 本质上就是人机交互的一个桥梁, 负责解释用户输入的执行。

四、Shell 的种类

既然Shell是一个沟通的“桥梁” , 那么桥梁应该会有很多种。我们可以看下Linux 下有哪些解释器。

# 查看Linux 操作系统版本信息
[root@converts ~]# cat /proc/version
Linux version 4.18.0-305.3.1.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Tue Jun 1 16:14:33 UTC 2021

# 查询 shells 有哪些类型
[root@converts ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

在Linux和类Unix系统中,/bin/sh/bin/bash,以及 /usr/bin/sh/usr/bin/bash 都是指向shell解释器的路径。它们的主要区别在于所指向的具体shell类型和行为模式:

1、/bin/sh 和 /usr/bin/sh 比较

  • 传统意义上,在某些Linux发行版中,/bin/sh 作为系统内建的POSIX兼容shell的软链接或硬链接,这可能是bash,也可能是其他更符合POSIX标准的shell,比如dash(在Ubuntu等一些Debian系发行版中常见)或ash(在Alpine Linux中使用)。

  • 这些shell旨在遵守POSIX标准,提供最小化且兼容的命令环境,不包含bash的所有扩展特性。

  • 实际上,/usr/bin/sh/bin/sh 往往是符号链接到同一个实际shell可执行文件。系统管理员可以根据需要更改/bin/sh指向的shell,确保系统脚本遵循POSIX标准,减少依赖特定shell特性的风险。

2、/bin/bash 和 /usr/bin/bash 比较

  • /bin/bash/usr/bin/bash 均指向Bourne-Again Shell(Bash)的完整实现,这是GNU项目的一部分,是Linux中最常用的shell之一。

  • Bash不仅包含了POSIX标准要求的功能,还提供了许多额外的特性,如命令历史、别名、函数、条件表达式、数组、字符串处理扩展、job控制等等。

  • /bin/bash/usr/bin/bash 通常是同一个可执行程序的两个副本或链接,这样设计是为了方便系统组织和兼容不同的启动脚本路径约定。在现代Linux系统中,它们通常都指向同一个bash版本。

总结:
/bin/sh/usr/bin/sh 通常代表了POSIX兼容的shell,而 /bin/bash/usr/bin/bash 则代表了具有更多特性和扩展功能的Bash shell。在编写shell脚本时,选择使用#!/bin/sh还是#!/bin/bash取决于脚本是否需要依赖Bash特有的非POSIX特性。为了更好的跨平台和兼容性,推荐仅使用POSIX标准定义的shell特性并在脚本开头写成#!/bin/sh,除非确实需要bash的特殊功能。

五、什么是Shell脚本?

一句话来概括就是:将需要执行的命令保存到文本中,按照顺序执行。他是解释型的,意味着不需要编译。

六、Shell 脚本的基本写法

1、脚本第一行,必须执行解释器【必写】

!/bin/hash 表示以下内容使用bash解释器解析。

warning 注意:如果直接将解释器路径写死在脚本里,可能在某些系统就存在找不到解释器的兼容性问题,所以可以使用:#!/bin/env bash 解释器

2、脚本第二部分,对shell脚本的描述【非必写】

这一部分不是必写的, 不过都建议写上,方便后期维护等问题。(#:表示注释的意思)

# 以下内容是对脚本基本信息的描述
# Name:名字
# Desc:对脚本的描述
# Path: 存放路径
# Author: 创建人
# UpdateTime: 更新时间

3、脚本第三部分,脚本要实现的具体内容

这个部分就是正式开始编写脚本了。这里就不赘述了, 后续会讲解脚本的基本语法。

七、Shell脚本的执行方法

1、标准脚本执行的方法(建议)

# 该目录下有个 Demo.sh 的脚本文件
[root@converts shells]# ll
total 4
-rw-r--r-- 1 root root 25 Dec  6 10:29 Demo.sh

# 1.授权(必须要授权)
[root@converts shells]# chmod +x Demo.sh

# 2.执行脚本
[root@converts shells]# ./Demo.sh
胖太乙
[root@converts shells]# 

# 2.执行脚本(方式2)
[root@converts shells]# pwd
/root/shells
[root@converts shells]# /root/shells/Demo.sh
胖太乙
[root@converts shells]#

2、非标准的执行方法(不建议)

[root@converts ~]# cd /root/shells
[root@converts shells]# bash Demo.sh 
胖太乙
[root@converts shells]# sh Demo.sh 
胖太乙
[root@converts shells]# source Demo.sh 
胖太乙
[root@converts shells]# bash -x  Demo.sh 
+ echo 胖太乙
胖太乙
[root@converts shells]#

-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题

展开/折叠菜单
164 预览数量 2024-03-25 17:26:53 发布 时间
目录
赞数量
评论数量
返回顶部
暂无评论

暂无评论