Linux Shell 脚本编写指南——第一章


本文为Linux Shell Scripting Tutorial (LSST) v2.0学习记录


第一章

本章节学习任务:

  • 了解什么是shell脚本
  • 了解Linux kernel, shell, bash and scripting basic

1.1 Linux是什么

Linux是一个基于Unix的开源操作系统,Linus Torvalds是其开发者,同时也得到了世界上很多开发者的帮助,他的特性包括但不限于:

  • 免费
  • 类Unix系统
  • 开源
  • 网络操作系统

严格意义上来说,Linux是一个kernel(内核),kernel提供了对计算机硬件和资源的访问与操作:

  • 文件和数据
  • 运行中的程序
  • 加载程序到内存
  • 网络
  • 安全和防火墙
  • 。。。等等

但是一个系统只有kernels是不够的,日常的使用需求还要求系统携带文本编辑器、邮件客户端、浏览器、办公应用等;所以就有了基于Linux kernel并整合了多种工具的Linux发行版,一般来说,发行版需要具有以下的特征:

  • Linux kernel
  • GUN应用
  • 图形使用界面
  • 办公应用
  • 软件开发工具和编译器
  • 充足的可使用的软件包
  • Linux 安装程序(脚本)
  • Linux管理工具(例如增加使用者,安装软件等)
  • 一个整合了这些特性的shell

有些公司在使用Linux的时候需要技术支持,就催生了一些公司例如 Red HatNovell 等公司发行收费的Linux发行版并提供技术支持,当然开源社区也有完全免费的产品例如DebianGentoo等。目前世界上有超过200种Linux发行版。

1.2 谁创建了Linux

1991年,Linus Torvalds在大学期间接触到了UNIX,他当时使用的是一个适用于科研的Unix版本(Minix),但是Minix有着不少缺陷,于是他就开发了他自己的"Minix",也就是后来的Linux,Linux的开源也就是从这个时候开始的。

Linus Torvalds

Linux是Linus开发的kernel,Linux与GUN项目中的系统程序与库绑定在一起,创造了一个可用性很高的操作系统。有时候大家会把Linux说成GUN/Linux是因为Linux是直接整合的GUN项目,另外需要知道的是,Linus Torvalds是Linux kernel的创作者,而不是Linux系统的拥有者[1]

Linux 发布版 = Linux kernel + GUN 系统实用程序和库 + 安装脚本 + 管理程序

另外需要注意的是,Linux目前有很多发行版,以适应服务器、桌面、工作站等一系列的需求。

额外链接:

Linus Torvalds profile at Google+

Linus Torvalds

Linus's Blog (not updated anymore)

1.3 在哪里下载Linux

通过网络进行下载是最方便的,以下是推荐的数款发布版本(下列不予翻译):

  • Fedora Linux - Fedora is a distribution of Linux based on Red Hat linux, developed by the Fedora Project. Fedora is good for both desktop and laptop usage including sys admins.
  • CentOS Linux - CentOS is a community-supported, mainly free software operating system based on Red Hat Enterprise Linux. CentOS is good for server usage.
  • Debian Linux - Debian focuses on stability and security and is used as a base for many other distributions such as Ubuntu. Debian stable is good for server usage.
  • Ubuntu Linux - Ubuntu originally based on the Debian Linux distribution. Ubuntu is designed primarily for desktop usage, though netbook and server editions exist as well.
  • OpenSuse Linux - openSUSE is a general purpose Linux distribution and sponsored by Novell. However, it is quite popular on Laptop and desktop usage.
  • Slackware Linux - It was one of the earliest operating systems to be built on top of the Linux kernel and is the oldest currently being maintained. Slackware is pretty popular among the hardcore Linux users and sys admins.
  • Linux Mint Linux - Linux Mint provides an up-to-date, stable operating system for the average user, with a strong focus on usability and ease of installation.
  • PCLinuxOS Linux - PCLinuxOS comes with KDE Plasma Desktop as its default user interface. It is a primarily free software operating system for personal computers aimed at ease of use.
  • Mandriva Linux - Mandriva Linux is a French Linux distribution distributed by Mandriva. It uses the RPM Package Manager.
  • Sabayon Linux - Sabayon is based upon Gentoo Linux and it follows the OOTB (Out of the Box) philosophy, having the goal to give the user a wide number of applications ready to use and a self-configured operating system.
  • Arch Linux - Arch Linux is a Linux distribution intended to be lightweight and simple. The design approach of the development team focuses on simplicity, elegance, code correctness and minimalism.
  • Gentoo Linux - Gentoo Linux is a computer operating system built on top of the Linux kernel and based on the Portage package management system.

1.4 如何安装Linux

1.5 什么是Linux Kernel

kernel是Linux操作系统的核心,每个Linux发行版都会包括两个部分:

  1. Linux kernel
  2. Linux shell

kernel的作用包括文件管理、多任务处理、内存管理、输入输出设备管理、进程管理、设备管理、网络管理(包括ipv4和ipv6)以及一系列更加深入的功能。kernel决定谁会使用这些资源已经什么时候用,用多久。

Kernel

1.6 什么是Linux Shell

计算机能够理解的语言为二进制语言(binary language),早期我们都是使用二进制语言进行操控电脑,但是对我们而言很难阅读及理解。因此,在一个操作系统内有一个特别的程序叫做shell,shell接受人类可以轻易理解的指令并将其转化为kernel可以读入和处理的语言。

Shell是什么

  • shell是一个面对用户的程序,或者说它是提供给用户的交互环境
  • 它是一个解释器,从标准输入设备例如键盘⌨或者文件读入指令并执行
  • shell在用户登入或者打开终端的时候启动
  • 执行系统程序快捷和简单的方法
  • shell不是kernel的一部分,但是调用系统kernel执行程序
  • 现在 Linux中可用的shell包括:

注意:所有的shell做的都是同一种工作,只是理解不一样的语法和提供不一样的内建功能,微软开发的 MS-DOS(Microsoft Disk Operating System)叫做 COMMAND.COM, 行使的是和shell一样的功能,只不过还不是那么强大

命令提示符 (Shell Prompt)

有多种方式可以操作shell:

  • 终端:桌面版Linux一般都会提供一个基于登陆系统的图形用户界面,一旦登陆就可以通过XTerm/GTerm/KTerm等应用操作shell
  • 通过secure shell:一旦登录远端服务器或者工作站就会得到一个命令提示符
  • 通过console:有些Linux提供基于文件的登陆系统,一般来说在登陆以后同样会得到一个命令提示符

如何知道我现在有哪些shell

执行以下的命令即可完成:

new@Chevy-PC:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen

多个结果意味着你的Linux支持多个shell

命令行界面 (Command Line Interface, CLI)

shell提供了连接Linux的界面,你可以通过键盘或者其他输入设备完成操作,shell同时也可以成为命令行界面 (Command Line Interface), 发现现在使用的shell可以通过使用以下命令:

new@Chevy-PC:~$ echo $SHELL
/bin/bash
new@Chevy-PC:~$ ps $$
  PID TTY      STAT   TIME COMMAND
    4 tty1     S      0:00 -bash
new@Chevy-PC:~$ ps -p $$
  PID TTY          TIME CMD
    4 tty1     00:00:00 bash

这就说明我目前使用的是bash shell

基本的命令行操作

你可以使用以下的组合键去编辑和撤销命令:

  • CTRL + L : 清理当前屏幕.
  • CTRL + W : 清理光标所在处的单词
  • CTRL + U : 清理全行命令
  • Up键和Down键 : 回溯之前/之后的命令 (command history).
  • Tab : 自动补全命令/目录名等等
  • CTRL + R : 搜索命令记录 (command history)
  • CTRL + C : 终止当前命令
  • CTRL + T : 交换光标前的最后两个字符
  • ESC + T : 交换光标前的最后两个单词
  • CTRL + H : 删除从光标处开始的字母

执行一个命令

简单的键入你的命令然后回车即可,例如date命令可以查看当前的时间, man data命令可以查看date命令的使用文档,info date可以查看date命令的信息文档,同时常见的命令都会有-h / --help参数用以展示帮助选项:

new@Chevy-PC:~$ date
Thu Jul 11 10:35:03 DST 2019
new@Chevy-PC:~$ man date
DATE(1)                                      User Commands                                      DATE(1)

NAME
       date - print or set the system date and time

SYNOPSIS
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION
       Display the current time in the given FORMAT, or set the system date.

       Mandatory arguments to long options are mandatory for short options too.

       -d, --date=STRING
              display time described by STRING, not 'now'

       --debug
              annotate the parsed date, and warn about questionable usage to stderr

       -f, --file=DATEFILE
              like --date; once for each line of DATEFILE

       -I[FMT], --iso-8601[=FMT]
              output  date/time  in  ISO 8601 format.  FMT='date' for date only (the default), 'hours',
              'minutes', 'seconds', or 'ns' for date and time to  the  indicated  precision.   Example:
              2006-08-14T02:34:56-06:00

 Manual page date(1) line 1 (press h for help or q to quit)
new@Chevy-PC:~$ info date 
 Next: arch invocation,  Up: System context

21.1 ‘date’: Print or set system date and time
==============================================

Synopses:

     date [OPTION]... [+FORMAT]
     date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ]

   Invoking ‘date’ with no FORMAT argument is equivalent to invoking it
with a default format that depends on the ‘LC_TIME’ locale category.  In
the default C locale, this format is ‘'+%a %b %e %H:%M:%S %Z %Y'’, so
the output looks like ‘Thu Mar  3 13:47:51 PST 2005’.

   Normally, ‘date’ uses the time zone rules indicated by the ‘TZ’
environment variable, or the system default rules if ‘TZ’ is not set.
*Note Specifying the Time Zone with ‘TZ’: (libc)TZ Variable.

   If given an argument that starts with a ‘+’, ‘date’ prints the
current date and time (or the date and time specified by the ‘--date’
option, see below) in the format defined by that argument, which is
similar to that of the ‘strftime’ function.  Except for conversion
specifiers, which start with ‘%’, characters in the format string are
printed unchanged.  The conversion specifiers are described below.

   An exit status of zero indicates success, and a nonzero value
-----Info: (coreutils)date invocation, 40 lines --Top-----------------------------------------------------Welcome to Info version 6.5.  Type H for help, h for tutorial.

1.7 UNIX的哲学

Unix哲学是基于Unix操作系统主要开发人员的经验开发软件的哲学方法,下面的哲学方法也适用于Linux操作系统:

  • Do one thing and do it well - Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.
  • Everything is file - Ease of use and security is offered by treating hardware as a file.
  • Small is beautiful.
  • Store data and configuration in flat text files - Text file is a universal interface. Easy to create, backup and move to another system.
  • Use shell scripts to increase leverage and portability - Use shell script to automate common tasks across various UNIX / Linux installations.
  • Chain programs together to complete complex task - Use shell pipes and filters to chain small utilities that perform one task at time.
  • Choose portability over efficiency.
  • Keep it Simple, Stupid (KISS).

额外链接:

1.8 什么 是shell脚本

一般来说,shell是交互性的 ,也就是说你输入命令,shell接受并执行,返回结果。但是,如果你储存一系列的命令在一个文本文件里面然后执行,这也就是shell程序(shell program)或者称为shell脚本(shell script)

每个shell脚本都会包括一下几个部分:

  • Shell kewwords 例如if...else语句, do...while语句
  • Shell commands 例如pwd, test, echo, continue, type等命令
  • Linux binary commands 例如w, who, free, etc等
  • 文本处理程序例如grep, awk, cut等
  • 函数可以将多个操作整合进一个函数
  • 控制流例如if...then...else或者shell loop去执行重复的操作

每个脚本都有一个目的

  • 特殊目的:备份数据或者上传数据库(例如每隔一段时间执行某个脚本将将数据重新备份)
  • 执行命令:每个shell脚本就像一条条命令那样被简单执行(使用脚本处理某个数据)
  • 脚本代码利用:Shell脚本可以从现有脚本扩展。此外,还可以使用函数文件来打包经常使用的任务

1.9 为什么使用shell脚本

当你在终端不停执行重复命令的时候,shell脚本就显得很有用

特性:

  • shell脚本可以从命令行或者文件读入数据参数,然后将结果返回到屏幕
  • 当你在重复执行同一个任务的时候,你就应该使用shell脚本来减少你的工作量
    • 创建自己的实用工具
    • 自动化的输入或者输出
    • 定制管理任务
    • 因为脚本的重复性及经过测试,所以会减少犯错的几率

常见的应用场景:

  • 管理你的Linux系统
  • 数据备份和创建快照
  • 转储Oracle或者MySQL数据库进行备份
  • 创建基于电子邮件的警报系统
  • 找出什么程序吃掉了你部分的系统资源
  • 找出可用的内存
  • 找i出所有登陆的用户以及他们在做什么
  • 找出所有失败的登陆记录,如果同一个IP在重复尝试失败的登录,通过防火墙封掉该IP
  • 根据你的安全策略进行用户管理
  • 找出本地或者远程服务器的信息
  • 配置服务器

优势:

  • 使用简单
  • 快速启动
  • 节约时间
  • 系统管理任务自动化
  • Shell脚本可以在几乎任何现代UNIX / Linux / BSD / Mac OS X操作系统上执行,因为它们是用解释语言编写的

劣势:

  • 不同平台间会出现比较复杂的问题
  • 运行速度缓慢
  • 每一个shell命令都会开启一个新进程

本教程使用那种shell?

Bash shell

学习目标

完成本次课程以后,你可以学到:

  • 理解Linux shell编程的基础
  • 自行编写自动化的脚本
  • 自定义shell启动文件
  • 创建漂亮的实用程序
  • 控制你的管理任务,如Linux用户管理,Linux系统监控等

本章节复习题

  1. 什么是shell

徐爷的回答:一种交互环境,充当用户和kernel之间的解释

  1. 写下一个命令,列出终端下的文件

ls

  1. 写下一个命令,以逆创建时间的顺序列出所有以'.perl'结尾的文件信息

ls -r *.perl

  1. 写下一个命令,列出你在运行的程序

ps -aux | grep youranme or top -u yourname

  1. 写下一个命令,列出待打印的文件

lpq 需要安装软件

  1. 写下一个命令,删除3个文件分别叫做 file1.txt, file2.txt, and data1.txt

rm file1.txt file2.txt data1.txt

  1. 写下一个命令,在/tmp文件夹下创建一个子目录foo

mkdir -p /tmp/foo

  1. 写下一个命令,删除刚刚创建的目录

rmdir /tmp/foo

  1. 写下一个命令,列出ls命令所有的选项

man lsor man ls


  1. GNU/Linux FAQ by Richard Stallman