Shell学习-01-基础介绍

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 Shell学习-01-基础介绍,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1 shell基础

1.1 Shell介绍

  • 现在的操作系统(Windows、Mac OS、Android、iOS 等)都是带图形界面的,简单容易上手,对专业用户(程序员、网管等)和普通用户都非常适用;计算机的普及离不开图形界面。
  • 早期计算机没有图形界面,我们只能通过命令来控制计算机,这些命令繁多,且难记,人们面对的是计算机黑窗口;这个时候的计算机远没有普及,只有专业人员才能使用。
  • 对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行也就是图形界面和命令行要达到的目的是一样的,都是让用户控制计算机
  • 但是真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
  • 由于安全、复杂、繁琐等原因,用户不能直接接触内核,需要再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。这样在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell
  • Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。Shell 又是一门管理 Linux 系统的脚本语言。Shell 脚本虽然没有 C++、Python、Java、C#等编程语言强大,但也支持了基本的编程元素
  • Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 Firefox 等应用软件一样。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。

1.2 Shell 是如何连接用户和内核的

  • Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,然而Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行。
  • 接口其实就是一个一个的函数,使用内核就是调用这些函数。如:我们在 Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,然后内核就按照 Shell 的指令去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。

1.3 Shell 还能连接其它程序

  • Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
  • Shell 擅长使用和组织其他的程序,Shell 可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。
  • 可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。
    在这里插入图片描述

1.4 Shell 也支持编程

  • Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,和java一样

  • Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

    • if…else 选择结构,case…in 开关语句,for、while、until 循环;
    • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
    • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。
  • 所以,Shell 也是一种编程语言,它的编译器和解释器都是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。

  • Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。

  • 使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。

  • 对于 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器繁多,会浪费大量的时间在重复性的工作上。

1.5 Shell 是一种脚本语言

  • 任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。
  • 有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。
  • 这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
  • 有的编程语言,如 Shell、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。
  • 这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
  • 编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
  • 脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
  • Shell 就是一种脚本语言,编写完源码后不用编译,直接运行源码即可。

1.6 Linux 运维的脚本语言

  • 除了 Shell,能够用于 Linux 运维的脚本语言还有 Python 和 Perl。
  • Perl 比 Shell 强大很多,它的语法灵活、复杂,在实现不同的功能时可以用多种不同的方式,缺点是不易读,团队协作困难,现在Perl已经淘汰了。
  • Python 是近几年非常流行的语言,它不但可以用于脚本程序开发,也可以实现 Web 程序开发(知乎、豆瓣、YouTube、Instagram 都是用 Python 开发),甚至还可以实现软件的开发( OpenStack、SaltStack 都是 Python 语言开发)、游戏开发、大数据开发、移动端开发。Python 也成了运维人员必备的技能
  • Shell 脚本的优势在于处理偏操作系统底层的业务,例如,Linux 内部的很多应用(有的是应用的一部分)都是使用 Shell 脚本开发的,因为有 1000 多个 Linux 系统命令为它作支撑,特别是 Linux 正则表达式以及三剑客 grep、awk、sed 等命令。
  • 对于一些常见的系统脚本,使用 Shell 开发会更简单、更快速,例如,让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,它们可能就不如 Shell 脚本流行以及有优势了。对于一些常见的业务应用,使用 Shell 更符合 Linux 运维简单、易用、高效的三大原则。
  • Python 语言的优势在于开发复杂的运维软件、Web 页面的管理工具和 Web 业务的开发(例如 CMDB 自动化运维平台、跳板机、批量管理软件 SaltStack、云计算 、OpenStack 软件)等。
  • 我们在开发一个应用时,应该根据业务需求,结合不同语言的优势以及自己擅长的语言来选择,扬长避短,从而达到高效开发、易于自己维护的目的。

1.7 进入Shell的两种方式

  • Linux 发展的早期,唯一能用的工具就是 Shell,Linux 用户都是在 Shell 中输入文本命令,并查看文本输出;如果有必要的话,Shell 也能显示一些基本的图形。

  • 如今 Linux 的环境已经完全不同,几乎所有的 Linux 发行版都使用某种图形桌面环境(例如 GNOME、KDE、Unity 等),这使得原生的 Shell 入口被隐藏了,进入 Shell 少了起来。

  • 方式1:进入 Linux 控制台。让 Linux 系统退出图形界面模式,进入控制台模式,这样一来,显示器上只有一个简单的带着白色文字的“黑屏”,就像图形界面出现之前的样子。这种模式称为 Linux 控制台(Console)

  • 现代 Linux 系统在启动时会自动创建几个虚拟控制台(Virtual Console),其中一个供图形桌面程序使用,其他的保留原生控制台的样子。虚拟控制台其实就是 Linux 系统内存中运行的虚拟终端(Virtual Terminal)。

  • 从图形界面模式进入控制台模式也很简单,往往按下Ctrl + Alt + Fn(n=1,2,3,4,5...)快捷键就能够来回切换。CentOS 在启动时会创建 6 个虚拟控制台,按下快捷键Ctrl + Alt + Fn(n=2,3,4,5,6)可以从图形界面模式切换到控制台模式,按下Ctrl + Alt + F1可以从控制台模式再切换回图形界面模式。也就是说,1 号控制台被图形桌面程序占用了
    在这里插入图片描述

  • 进入了控制台模式,输入用户名和密码,登录成功后就可以进入 Shell 。$是命令提示符,我们可以在它后面输入 Shell 命令

在图形界面模式下,输入密码时往往会显示为 *,密码有几个字符就显示几个 *;而在控制台模式下,输入密码什么都不会显示,只要输入的密码正确就能够登录。

图形界面也是一个程序,会占用 CPU 时间和内存空间,当 Linux 作为服务器系统时,安装调试完毕后,应该让 Linux 运行在控制台模式下,以节省服务器资源。正是由于这个原因,很多服务器甚至不安装图形界面程序,管理员只能使用命令来完成各项操作。

  • 方式2:使用终端。进入 Shell 的另外一种方法是使用 Linux 桌面环境中的终端模拟包(Terminal emulation package),也就是我们常说的终端(Terminal),这样在图形桌面中就可以使用 Shell。可以在“应用程序”菜单中找到终端,打开终端后,就可以输入 Shell 命令了

  • CentOS 默认的图形界面程序是 GNOME,该终端模拟包也是 GNOME 自带的。除了 GNOME 终端,Linux 还有其他的终端模拟包xterm 终端、Konsole 终端

xterm 终端:最基础的 X Windows 桌面程序自带的终端模拟包就是 xterm。xterm 在 X Windows 出现之前便已经存在了,默认包含在大多数 X Windows 中。xterm 虽然没有太多炫目的特性,但是运行它不需要太多的资源,所以 xterm 在针对老硬件设计的 Linux 发行版中仍然很常见,比如 fluxbox 图形桌面环境就用它作为默认的终端模拟包。

Konsole 终端:KDE 桌面项目也开发了自己的终端模拟包,名为 Konsole。Konsole 整合了基本的 xterm 特性以及一些更高级的类似 Windows 应用程序的特性。

1.8 Shell命令的基本格式

  • 进入 Shell 以后,我们就可以输入命令来使用 Linux 的各种功能了,在使用 Shell 命令之前,先学习一下 Shell 命令的基本格式
  • 进入 Shell 以后,第一眼看到的内容类似下面这种形式:
[root@CNCLUKZK ~]#
  • 这叫做命令提示符,看见它就意味着可以输入命令了。命令提示符不是命令的一部分,它只是起到一个提示作用.
  • Shell 命令的基本格式如下:
command [选项] [参数]  #[]表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数。

ls 是常用的一个命令,它属于目录操作命令,用来列出当前目录下的文件和文件夹。ls 可以附带选项,也可以不带,不带选项的写法为:

[root@CncLucZK usr]# ls
bin  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
  • 先执行`cd …/usr命令进入 usr目录。接着执行 ls -l命令,它列出了 usr目录下的所有文件,并且进行了格式对齐。
[root@CncLucZK /]# cd ../usr
[root@CncLucZK usr]# ls -l
total 136
dr-xr-xr-x.   2 root root 36864 Oct  6 21:23 bin
drwxr-xr-x.   2 root root  4096 May 11  2019 games
drwxr-xr-x.  61 root root 12288 Jun  3 22:13 include
dr-xr-xr-x.  38 root root  4096 Dec 31  2020 lib
dr-xr-xr-x.  55 root root 36864 Jun  3 22:14 lib64
drwxr-xr-x.  27 root root  4096 Dec 31  2020 libexec
drwxr-xr-x.  15 root root  4096 Jun  4 12:18 local
dr-xr-xr-x.   2 root root 20480 Jun  3 22:14 sbin
drwxr-xr-x. 110 root root  4096 Jun  3 22:13 share
drwxr-xr-x.   4 root root  4096 Nov 26  2019 src
lrwxrwxrwx.   1 root root    10 May 11  2019 tmp -> ../var/tmp
[root@CncLucZK usr]# 
  • 加一个-l选项,则可以看到显示的内容明显增多了。-l是长格式(long list)的意思,也就是显示文件的详细信息。

  • 可以看到,选项的作用是调整命令功能。如果没有选项,那么命令只能执行最基本的功能;而一旦有选项,则能执行更多功能,或者显示更加丰富的数据。

  • 短格式选项和长格式选项:Linux 的选项又分为短格式选项和长格式选项。

    • 短格式选项是长格式选项的简写,用一个减号-和一个字母表示,例如ls -l
    • 长格式选项是完整的英文单词,用两个减号--和一个单词表示,例如ls --all
  • 一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如 ls 命令的短格式选项-l就没有对应的长格式选项,所以具体的命令选项还需要通过帮助手册来查询。

  • 使用参数:参数是命令的操作对象,一般情况下,文件、目录、用户和进程等都可以作为参数被命令操作

[root@CncLucZK test]# bash test1.sh
hellotony
hello tony
hello: tony
hello: tony
hello hello: tony too

  • 但是为什么 ls 命令可以省略参数?那是因为有默认参数。命令一般都需要加入参数,用于指定命令操作的对象是谁。如果可以省略参数,则一般都有默认参数。如: ls 命令后面如果没有指定参数的话,默认参数是当前所在位置,所以会显示当前目录下的文件名。

  • 选项和参数一起使用:Shell 命令可以同时附带选项和参数,例如
    在这里插入图片描述

  • -n是 echo 命令的选项’Hello world是 echo 命令的参数,它们被同时用于 echo 命令。

  • echo 命令用来输出一个字符串,默认输出完成后会换行;给它增加-n选项,就不会换行了。

  • 选项附带的参数:有些命令的选项后面也可以附带参数,这些参数用来补全选项,或者调整选项的功能细节。

  • 例如,read 命令用来读取用户输入的数据,并把读取到的数据赋值给一个变量,它通常的用法为:

read str   #str 为变量名。
  • 如果我们只是想读取固定长度的字符串,那么可以给 read 命令增加-n选项。比如读取2个字符,那么可以这样写:read -n 2 str
    在这里插入图片描述

2-n选项的参数,str是 read 命令的参数。

-n选项表示读取固定长度的字符串,那么它后面必然要跟一个数字用来指明长度,否则选项是不完整的。

  • Shell 命令的选项用于调整命令功能,而命令的参数是这个命令的操作对象。有些选项后面也需要附带参数,以补全命令的功能。

参考文献:
Shell是什么?1分钟理解Shell的概念!

下一篇:Shell学习-02-执行Shell脚本

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123692.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!