如果您使用的是 Microsoft、Apple 或 Linux 操作系统(OS),您很可能在不知不觉中就在使用 shell 脚本。事实上,每次启动 Linux 操作系统,您都会与 shell 进行交互。
Shell 脚本通过自动化,帮助程序员、数据科学家和普通用户节省时间,避免重复性工作。例如,脚本可以执行每日备份、安装补丁、监控系统及活动,并进行常规审计。
Shell 能读取相对直观、面向人的命令,并将其转换为系统可以理解的内容。
什么是 Shell?
Shell 是一种称为命令行解释器的计算机程序,允许 Linux 和 Unix 用户通过命令行界面控制其操作系统。Shell 使用户能够高效且直接地与操作系统进行通信。
Shell 脚本并不是单一语言,但由于它使用了一些自然语言式的命令,即便没有编程背景也很容易上手。不过,每一种 shell 脚本变体都可以视为一门语言;如果您计划编写更复杂的脚本,就需要大量练习。
Shell 脚本是搭建自动化的最简单方式之一。借助 Linux 或 Unix 命令,Shell 为数据科学家、DevOps 和 TechOps 提供条件与循环控制结构,以便重复执行命令。
Shell 脚本并不总是同名。sh、Bash(最常见)、csh 和 tesh 都是 shell 脚本。在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件(batch files)。
Shell 有两类:命令行 shell 和图形 shell。命令行 shell 通过命令行界面访问,系统以人类可读的命令接收输入,并通过命令行界面显示输出。
图形 shell 使用图形用户界面(GUI)来执行交互与基本操作,例如打开、关闭和保存文件。
以下是一些示例 shell 命令 :
查看当前所在目录:pwd
在手册中查找某个命令:man command
将文本文件以可滚动方式查看:less file 1 或 more file 1
不同类型的 Shell
Bourne Shell
尽管名字很酷,Bourne shell 与间谍或高速飙车并无关系。Bourne shell 是第二常用的 Unix shell,由 Stephen Bourne 于 1979 年在贝尔实验室创建。与其前身 Thompson shell 一样,Bourne 的可执行文件名为 sh。
Bourne shell 是 Solaris 操作系统的默认 shell。尽管年代久远,Bourne shell 至今仍受欢迎,原因在于其速度快、体积小。但它的交互性不强,无法调用其命令历史,也缺乏逻辑与算术表达能力。
Bourne 提示符包括:
命令完整路径:/bin/sh 和 /sbin/sh
非 root 用户默认提示符:$
root 用户默认提示符:#
命令行
C shell,文件名为 csh,以及其前身文件名 tcsh,是 70 年代末期的另一种 Unix shell。它由当时就读于加州大学伯克利分校的研究生 Bill Joy 创建。
与 Bourne shell 不同,C shell 具有交互性,并支持命令历史和别名。C shell 还包含类似 C 的表达式语法和内置算术运算。
命令行提示符包括:
命令完整路径:/bin/csh
非 root 用户默认主机名提示符:%
root 用户默认主机名提示符:#
KornShell
KornShell,文件名为 ksh,由 David Korn 在 20 世纪 80 年代初于贝尔实验室开发。KornShell 包含了 C shell 的许多功能,并且是 Bourne shell 的超集,因此向后兼容 Bourne shell。
KornShell 运行速度比 C shell 更快。它能运行 Bourne shell 脚本,并提供类似 C 的数组、函数和字符串处理功能。此外,它还具备内置算术运算。
KornShell 提示符包括:
命令完整路径:/bin/ksh
非 root 用户默认提示符:$
root 用户默认提示符:#
GNU Bourne-Again shell
GNU Bourne-Again,或称 Bash,是 Bourne shell 的开源替代方案。它由 Brian Fox 为 GNU 项目设计,并于 1989 年发布。它不仅与 Bourne shell 完全兼容,还吸收了 KornShell 和 C shell 的诸多优点。GNU Bourne-Again shell 自动映射了用于编辑和命令回显的方向键。
GNU Bourne-Again 提示符包括:
命令完整路径:/bin/bash
非 root 用户默认提示符:bash-x.xx$
root 用户默认提示符:bash-x.xx#
Shell 脚本的作用
这个类比略显简化,但可以把 shell 脚本想象成程序员的“自动填充”。与其逐条在键盘上输入命令,不如把一系列命令写成单个脚本,用户只需在命令行中输入一个简单的文件名即可触发。Shell 脚本可以执行程序运行、文本处理和文件操作。
Shell 脚本可以完成多种任务,包括监控(如磁盘使用情况)、执行备份、创建命令行工具、操作文件、运行程序、将程序链接在一起、完成批处理等。
Shell 的主要替代方案
在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件。这些仍然是 shell 脚本。其他脚本语言,如 Javascript、Python、Perl 和 TCL,也都是脚本语言。不出所料,计算机专业人士各有所爱;我们稍后会谈到 shell 的优缺点。
为什么 Shell 如此流行?
Shell 在几乎所有操作系统上都很常见,因为它高效且易于更新。它可以监控您的计算机系统并执行常规备份,而无需您操心。
无需切换语法,因为 shell 的语法和命令与在命令行中输入的完全一致。此外,编写 shell 脚本简单且快速:启动快,调试也方便。
Shell 脚本有哪些缺点?
Shell 脚本容易出错,一旦出现问题也不易诊断。Shell 并非为复杂或大型任务设计,执行速度较慢。此外,Shell 在数据结构方面支持有限,还可能存在语法或设计缺陷。
Shell 是何时创建的?
第一份 shell 脚本 由 MIT 的计算机工作人员 Louis Pouzin 于 20 世纪 60 年代初创建。他的第一个命令行是 RUNCOM,它让计算机科学家从编译、更新、重命名和移动等重复性任务中解放出来。
Pouzin 并非计算机语言专家,或许正因如此,他认为命令行本身就可以成为一种语言。
到 60 年代中期,Pouzin 与英国科学家 Christopher Strachey 合作。Strachey 设计了一个宏生成器,作为 Pouzin 命令语言的基础,运行在当时最先进的 Multics 操作系统之上。
Shell 名称的由来
Pouzin 将他的新语言命名为 “shell”,因为它是操作系统的最外层 。
Shell 特性
Shell 之所以受程序员欢迎,是因为它简洁。但这并不意味着它很“基础”。Shell 提供了多项特性,包括:
后台处理
Shell 脚本的一大优势在于它能在后台运行。根据命令不同,Shell 可以在前台或后台执行。前台进程显示在屏幕上,只能按顺序运行。
后台进程不会显示在屏幕上,可以非顺序运行。要在后台运行 shell 脚本,用户只需在脚本末尾添加一个和号(&)。
通配符替换
通配符替换允许系统一次处理多个命令,或从文本文件中查找短语片段。例如,* 告诉系统匹配任意字符串,甚至是空字符串;? 匹配单个字符;[example] 匹配任一字符(“example” 仅为示例);[1-9](另一个示例)指示 shell 匹配某个范围内的字符。
命令别名
Shell 别名是命令快捷方式。有的别名是一个词,有的是单个字母。要查看别名列表,用户只需输入 ·alias。
命令历史
Shell 有许多节省时间和精力的方式,其中一个特别方便的功能是命令历史。无需重新输入命令,history 命令会显示该会话期间使用过的所有命令。
文件名替换
文件名替换也称为 “globbing”。当一个词包含 ?、* 或 [ 等字符,或者以 ~ 开头时,Shell 会将其视为模式,并用按字母顺序排列、与该模式匹配的文件名列表来替换。
输入/输出重定向
输入/输出(i/o)重定向允许用户将标准输入(stdin)和标准输出(stdout)与显示屏、键盘或文件进行互换关联。
管道
Shell 管道是另一种重定向方式,可将某个命令/进程/程序的输出发送到另一个命令/进程/程序。这使各命令/进程/程序能够同时运行,并实现连续的数据传输,而无需经过显示屏或临时文本文件。
Shell 变量替换
当 Shell 遇到包含特殊字符的表达式时,它会将代码转换为更易于用户识别的形式。这个过程称为变量替换,或简称变量。
变量也常被有经验的程序员使用。例如,如果程序员在执行程序前并不知道实际数值,他们可以用变量作为占位符,待代码准备好执行时再替换。
Shell 的差异
主要有两类 Shell:“sh” 和 “bash”。二者都在 Unix 操作系统中运行。Shell 是对任意 shell 中脚本编写的通称。顾名思义,bash(Bourne Again Shell)是在 shell 基础上的改进与扩展。
Bash 通过升级提供了更多功能,支持作业控制,更易于使用,并支持命令历史。Sh 不支持命令历史;其脚本可在任意 shell 中运行,且可移植性更强。
Shell 多年来如何演进
多年来,Shell 在演进的同时也基本保持了核心不变。Bourne shell 相比最初的 Thompson shell 是一大进步,但许多最初的功能仍被保留。当然,计算机和我们的期望都发生了变化。
理论上,Shell 的种类可以和用户数量一样多;但从根本上讲,主要有两类 shell——命令行或 Bourne。其他都算作变体,而非不同语言。
Unix shells
Unix shell 是最初的形态,并且至今仍然强大。Unix shell 适用于 Unix 及与 Unix 相关的操作系统,如 Mac。
命令行
命令行(csh)是最常见的 Unix shell。命令行在交互式工作方面表现出色,包括别名、cdpath、作业控制、路径哈希、目录栈等功能。它们还提供编辑与历史记录功能。
Tenex 命令行
Tenex 命令行(tcsh)由 Caregia Melo University 的 Ken Greer 开发。Tenex 被认为是对原始命令行版本的改进。与最初的 C 不同,Tenex 提供命令行编辑与补全等功能。1981 年,tsch 与 csh 合并。
Korn shells
Korn shells(ksh)是另一种 Unix shell,可以看作是 C 与 Bourne 的折中方案,并与后者向后兼容。Korn shell 由 David Korn 于 20 世纪 80 年代初在贝尔实验室开发。
Bourne again shells
Bourne Again shell(Bash)是一种开源的 Unix shell,由 Brian Fox 在 20 世纪 90 年代后期为 GNU 项目编写,作为对 Bourne shell 的升级。
奇特的 Shell
尽管它们都构建在 C 或 Bourne shell 之上,程序员已经设计 了数百甚至上千种不同的变体。有些很实用,有些则纯属娱乐。
谁在使用 Shell?
几乎所有计算机用户都能从 shell 中受益,但它对系统管理员、DevOps 人员、程序员和数据科学家尤其有用。Shell 被用于自动化任务与应用、安装软件包、备份或恢复数据,当然也用于编程。
Shell 示例
Shell 的复杂程度取决于用户的需求。一个简单的 bash 问候示例如 echo “hello $USER”,而复杂的 shell 脚本 几乎没有上限。以下是一些基础示例:
示例 1:在 bash 中使用 while 循环 使用合适的编辑器在 bash 中创建一个文件。这里我们使用 vi 编辑器。
$ vi example.sh
这会打开一个名为 example.sh 的文件的编辑器窗口。 按下 “i” 键开始插入代码:
#!/bin/bash
valid = true
count = 1
while [ $valid ]
do
echo $count
if [ $count -eq 10 ] ;
then
break
fi
(( count++ ))
done 技术支持
按下 Esc,然后输入 “:wq” 保存并返回终端。 通过执行 bash example.sh 来运行
示例 2: 从终端接收用户输入
在 vi 编辑器中创建另一个文件:$vi example2.sh
在编辑器中输入以下代码:
#!/bin/bash
echo "Enter first number"
read x
echo "Enter second number"
read y
(( sum= x+ y))
echo "The result of addition = $sum " 技术支持
通过执行 bash example2.sh 来运行
要了解更多对数据科学有用的 shell 命令,请查看这篇关于
实用 Shell 命令 的教程。
与 Shell 相关的职业
与其说是职业路径,不如把 shell 脚本看作数据科学家工具库中的一件利器。各类数据从业者都需要掌握多种语言(或至少应该如此),而 shell 脚本有助于他们更高效地使用这些语言。
尽管如此,一些公司确实有明确要求掌握 shell 脚本的岗位。平均薪资约为 78,000 美元 。此外,shell 脚本也是诸如系统管理员等岗位的基石,而这些岗位的薪资可达六位数。
总结
Shell 就像贯穿各类编程语言的一根线。复杂命令被提炼为简洁且直观的速记。理解 shell 对任何数据科学家或计算机工程师而言都是一项重要技能。欢迎在 DataCamp 的Shell 入门 课程中进一步学习。
如果您使用的是 Microsoft、Apple 或 Linux 操作系统(OS),您很可能在不知不觉中就在使用 shell 脚本。事实上,每次启动 Linux 操作系统,您都会与 shell 进行交互。
Shell 脚本通过自动化,帮助程序员、数据科学家和普通用户节省时间,避免重复性工作。例如,脚本可以执行每日备份、安装补丁、监控系统及活动,并进行常规审计。
Shell 能读取相对直观、面向人的命令,并将其转换为系统可以理解的内容。
什么是 Shell?
Shell 是一种称为命令行解释器的计算机程序,允许 Linux 和 Unix 用户通过命令行界面控制其操作系统。Shell 使用户能够高效且直接地与操作系统进行通信。
Shell 脚本并不是单一语言,但由于它使用了一些自然语言式的命令,即便没有编程背景也很容易上手。不过,每一种 shell 脚本变体都可以视为一门语言;如果您计划编写更复杂的脚本,就需要大量练习。
Shell 脚本是搭建自动化的最简单方式之一。借助 Linux 或 Unix 命令,Shell 为数据科学家、DevOps 和 TechOps 提供条件与循环控制结构,以便重复执行命令。
Shell 脚本并不总是同名。
sh、Bash(最常见)、csh和 tesh 都是 shell 脚本。在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件(batch files)。Shell 有两类:命令行 shell 和图形 shell。命令行 shell 通过命令行界面访问,系统以人类可读的命令接收输入,并通过命令行界面显示输出。
图形 shell 使用图形用户界面(GUI)来执行交互与基本操作,例如打开、关闭和保存文件。
以下是一些示例 shell 命令:
查看当前所在目录:
pwd在手册中查找某个命令:
man command将文本文件以可滚动方式查看:
less file 1或more file 1不同类型的 Shell
Bourne Shell
尽管名字很酷,Bourne shell 与间谍或高速飙车并无关系。Bourne shell 是第二常用的 Unix shell,由 Stephen Bourne 于 1979 年在贝尔实验室创建。与其前身 Thompson shell 一样,Bourne 的可执行文件名为
sh。Bourne shell 是 Solaris 操作系统的默认 shell。尽管年代久远,Bourne shell 至今仍受欢迎,原因在于其速度快、体积小。但它的交互性不强,无法调用其
命令历史,也缺乏逻辑与算术表达能力。Bourne 提示符包括:
/bin/sh和/sbin/sh$#命令行
C shell,文件名为
csh,以及其前身文件名tcsh,是 70 年代末期的另一种 Unix shell。它由当时就读于加州大学伯克利分校的研究生 Bill Joy 创建。与 Bourne shell 不同,C shell 具有交互性,并支持
命令历史和别名。C shell 还包含类似 C 的表达式语法和内置算术运算。命令行提示符包括:
/bin/csh%#KornShell
KornShell,文件名为
ksh,由 David Korn 在 20 世纪 80 年代初于贝尔实验室开发。KornShell 包含了 C shell 的许多功能,并且是 Bourne shell 的超集,因此向后兼容 Bourne shell。KornShell 运行速度比 C shell 更快。它能运行 Bourne shell 脚本,并提供类似 C 的数组、函数和字符串处理功能。此外,它还具备内置算术运算。
KornShell 提示符包括:
/bin/kshGNU Bourne-Again shell
GNU Bourne-Again,或称 Bash,是 Bourne shell 的开源替代方案。它由 Brian Fox 为 GNU 项目设计,并于 1989 年发布。它不仅与 Bourne shell 完全兼容,还吸收了 KornShell 和 C shell 的诸多优点。GNU Bourne-Again shell 自动映射了用于编辑和命令回显的方向键。
GNU Bourne-Again 提示符包括:
/bin/bashbash-x.xx$bash-x.xx#Shell 脚本的作用
这个类比略显简化,但可以把 shell 脚本想象成程序员的“自动填充”。与其逐条在键盘上输入命令,不如把一系列命令写成单个脚本,用户只需在命令行中输入一个简单的文件名即可触发。Shell 脚本可以执行程序运行、文本处理和文件操作。
Shell 脚本可以完成多种任务,包括监控(如磁盘使用情况)、执行备份、创建命令行工具、操作文件、运行程序、将程序链接在一起、完成批处理等。
Shell 的主要替代方案
在 IBM 的 VM 操作系统中,它们被称为 EXEC;在 DOS 中,shell 脚本被称为批处理文件。这些仍然是 shell 脚本。其他脚本语言,如 Javascript、Python、Perl 和 TCL,也都是脚本语言。不出所料,计算机专业人士各有所爱;我们稍后会谈到 shell 的优缺点。
为什么 Shell 如此流行?
Shell 在几乎所有操作系统上都很常见,因为它高效且易于更新。它可以监控您的计算机系统并执行常规备份,而无需您操心。
无需切换语法,因为 shell 的语法和命令与在命令行中输入的完全一致。此外,编写 shell 脚本简单且快速:启动快,调试也方便。
Shell 脚本有哪些缺点?
Shell 脚本容易出错,一旦出现问题也不易诊断。Shell 并非为复杂或大型任务设计,执行速度较慢。此外,Shell 在数据结构方面支持有限,还可能存在语法或设计缺陷。
Shell 是何时创建的?
第一份 shell 脚本由 MIT 的计算机工作人员 Louis Pouzin 于 20 世纪 60 年代初创建。他的第一个命令行是
RUNCOM,它让计算机科学家从编译、更新、重命名和移动等重复性任务中解放出来。Pouzin 并非计算机语言专家,或许正因如此,他认为命令行本身就可以成为一种语言。
到 60 年代中期,Pouzin 与英国科学家 Christopher Strachey 合作。Strachey 设计了一个宏生成器,作为 Pouzin 命令语言的基础,运行在当时最先进的 Multics 操作系统之上。
Shell 名称的由来
Pouzin 将他的新语言命名为 “shell”,因为它是操作系统的最外层。
Shell 特性
Shell 之所以受程序员欢迎,是因为它简洁。但这并不意味着它很“基础”。Shell 提供了多项特性,包括:
后台处理
Shell 脚本的一大优势在于它能在后台运行。根据命令不同,Shell 可以在前台或后台执行。前台进程显示在屏幕上,只能按顺序运行。
后台进程不会显示在屏幕上,可以非顺序运行。要在后台运行 shell 脚本,用户只需在脚本末尾添加一个和号(&)。
通配符替换
通配符替换允许系统一次处理多个命令,或从文本文件中查找短语片段。例如,
*告诉系统匹配任意字符串,甚至是空字符串;?匹配单个字符;[example]匹配任一字符(“example” 仅为示例);[1-9](另一个示例)指示 shell 匹配某个范围内的字符。命令别名
Shell 别名是命令快捷方式。有的别名是一个词,有的是单个字母。要查看别名列表,用户只需输入
·alias。命令历史
Shell 有许多节省时间和精力的方式,其中一个特别方便的功能是命令历史。无需重新输入命令,
history命令会显示该会话期间使用过的所有命令。文件名替换
文件名替换也称为 “globbing”。当一个词包含
?、*或[等字符,或者以~开头时,Shell 会将其视为模式,并用按字母顺序排列、与该模式匹配的文件名列表来替换。输入/输出重定向
输入/输出(i/o)重定向允许用户将标准输入(stdin)和标准输出(stdout)与显示屏、键盘或文件进行互换关联。
管道
Shell 管道是另一种重定向方式,可将某个命令/进程/程序的输出发送到另一个命令/进程/程序。这使各命令/进程/程序能够同时运行,并实现连续的数据传输,而无需经过显示屏或临时文本文件。
Shell 变量替换
当 Shell 遇到包含特殊字符的表达式时,它会将代码转换为更易于用户识别的形式。这个过程称为变量替换,或简称变量。
变量也常被有经验的程序员使用。例如,如果程序员在执行程序前并不知道实际数值,他们可以用变量作为占位符,待代码准备好执行时再替换。
Shell 的差异
主要有两类 Shell:“sh” 和 “bash”。二者都在 Unix 操作系统中运行。Shell 是对任意 shell 中脚本编写的通称。顾名思义,bash(Bourne Again Shell)是在 shell 基础上的改进与扩展。
Bash 通过升级提供了更多功能,支持作业控制,更易于使用,并支持命令历史。Sh 不支持命令历史;其脚本可在任意 shell 中运行,且可移植性更强。
Shell 多年来如何演进
多年来,Shell 在演进的同时也基本保持了核心不变。Bourne shell 相比最初的 Thompson shell 是一大进步,但许多最初的功能仍被保留。当然,计算机和我们的期望都发生了变化。
理论上,Shell 的种类可以和用户数量一样多;但从根本上讲,主要有两类 shell——命令行或 Bourne。其他都算作变体,而非不同语言。
Unix shells
Unix shell 是最初的形态,并且至今仍然强大。Unix shell 适用于 Unix 及与 Unix 相关的操作系统,如 Mac。
命令行
命令行(csh)是最常见的 Unix shell。命令行在交互式工作方面表现出色,包括别名、cdpath、作业控制、路径哈希、目录栈等功能。它们还提供编辑与历史记录功能。
Tenex 命令行
Tenex 命令行(tcsh)由 Caregia Melo University 的 Ken Greer 开发。Tenex 被认为是对原始命令行版本的改进。与最初的 C 不同,Tenex 提供命令行编辑与补全等功能。1981 年,tsch 与 csh 合并。
Korn shells
Korn shells(ksh)是另一种 Unix shell,可以看作是 C 与 Bourne 的折中方案,并与后者向后兼容。Korn shell 由 David Korn 于 20 世纪 80 年代初在贝尔实验室开发。
Bourne again shells
Bourne Again shell(Bash)是一种开源的 Unix shell,由 Brian Fox 在 20 世纪 90 年代后期为 GNU 项目编写,作为对 Bourne shell 的升级。
奇特的 Shell
尽管它们都构建在 C 或 Bourne shell 之上,程序员已经设计了数百甚至上千种不同的变体。有些很实用,有些则纯属娱乐。
谁在使用 Shell?
几乎所有计算机用户都能从 shell 中受益,但它对系统管理员、DevOps 人员、程序员和数据科学家尤其有用。Shell 被用于自动化任务与应用、安装软件包、备份或恢复数据,当然也用于编程。
Shell 示例
Shell 的复杂程度取决于用户的需求。一个简单的 bash 问候示例如
echo “hello $USER”,而复杂的 shell 脚本几乎没有上限。以下是一些基础示例:使用合适的编辑器在 bash 中创建一个文件。这里我们使用 vi 编辑器。
$ vi example.sh按下 “i” 键开始插入代码:
通过执行
bash example.sh来运行$vi example2.shbash example2.sh来运行与 Shell 相关的职业
与其说是职业路径,不如把 shell 脚本看作数据科学家工具库中的一件利器。各类数据从业者都需要掌握多种语言(或至少应该如此),而 shell 脚本有助于他们更高效地使用这些语言。
尽管如此,一些公司确实有明确要求掌握 shell 脚本的岗位。平均薪资约为 78,000 美元。此外,shell 脚本也是诸如系统管理员等岗位的基石,而这些岗位的薪资可达六位数。
总结
Shell 就像贯穿各类编程语言的一根线。复杂命令被提炼为简洁且直观的速记。理解 shell 对任何数据科学家或计算机工程师而言都是一项重要技能。欢迎在 DataCamp 的Shell 入门课程中进一步学习。