30分钟Shell光速入门教程
视频系统介绍了Shell的基本概念、环境配置、常用命令及脚本编写,旨在帮助初学者快速掌握Shell编程与自动化操作。
UP主: GeekHour · 时长: 24:14 · 🔗 B站原视频
标签: Shell · Linux · 编程入门 · 命令行 · Bash
Shell 简介与环境准备
Shell 是一个命令行解释器,负责接收用户输入的命令,调用操作系统的内核去执行这些命令,再把执行的结果返回给用户。Shell 有很多种类,常见的有 Bourne shell、Bash、C shell、K shell 等等。Windows 系统上也有微软自己的命令提示符以及 PowerShell 等等。不同 Shell 的版本之间会存在一些比较微妙的差异,但是大部分的命令基本上都是通用的。
在 Linux 系统中默认安装的一般都是 Bash,在我们的课程中也会以 Bash 为例来讲解。使用 Windows 的同学不用担心,可以使用 Windows 自带的子系统,也就是 WSL 来安装一个 Linux。或者还有一个更简单的方式,安装一下 Git 的客户端,因为 Git 会自带一个轻量的 Git Bash。安装完成之后,在鼠标的右键菜单中就会出现一个 "Git Bash Here" 的选项,点击之后就会打开一个命令行窗口。这个窗口就是一个 Bash 环境,对于一些简单的命令行操作来说是完全够用的,在本期视频中介绍的所有内容也都是完全可以胜任的。
使用 Mac 和 Linux 的小伙伴就更不用担心了,只需要打开终端就可以直接使用 Shell。可以在应用程序中找到终端,也可以使用 Alfred 这样的工具来搜索并打开终端。打开之后就可以直接在终端中输入各种命令,这些命令就会被 Shell 解释并执行。
查看与切换 Shell 版本
打开终端之后,我们可以通过 cat 命令来查看一下 /etc 目录下的 shells 这个文件。这个文件记录了系统中所有的 Shell 版本。可以看到,除了我们刚刚提到的几个版本之外,还有一些其他的 Shell 版本。
那如何知道当前系统默认使用的是哪个 Shell 呢?可以通过系统的环境变量来查看。在 Linux 系统中,有很多环境变量用来存储一些系统的配置信息,比如 HOME 用来存储当前用户的家目录,PATH 用来存储系统的查找路径,也就是系统会在这些路径中查找各种命令的执行文件。而 SHELL 环境变量就是用来存储当前系统默认使用的 Shell 的路径的。我们可以通过 echo 命令来查看这些环境变量的值,后面加上一个 $ 符和环境变量的名称就可以了。可以看到现在系统默认使用的就是 Bash。
另外还可以使用 $0 来查看当前正在执行的脚本的名称,也是一样的结果。注意这里,$SHELL 和 $0 还是有一些区别的。$SHELL 是系统的环境变量,而 $0 是当前正在执行的脚本的名称。当我们切换到其他 Shell 版本的时候,$SHELL 这个环境变量并不会发生变化,但是 $0 就会变成其他版本的名称了。
我们来演示一下。刚刚我们在系统的配置文件中看到了一些其他的 Shell 版本,可以直接输入这些脚本的路径来切换到这个版本。比如输入 sh 就可以切换到 sh 这个版本。这个时候系统环境变量的 $SHELL 还是指向 Bash 的,但是 $0,也就是当前正在执行的脚本的名称,就变成了 sh 了。这也是我们在不同的 Shell 版本之间切换的一个方法。退出的话,直接输入 exit 就可以了。
编写第一个 Shell 脚本
刚刚我们提到了 Shell 是一个命令行解释器,它可以接收用户输入的命令,调用操作系统的内核去执行这些命令,再把执行的结果返回给用户。这种交互式的方式对于一些简单的操作来说是非常方便的。但是如果要执行一些复杂的操作,或者需要重复执行一些命令的时候,这样的方式就显得比较麻烦了。比如需要在凌晨的时候自动备份数据,或者需要定时清理一些日志文件等等,总不能每天半夜起来手动执行一遍吧。这个时候我们就可以把想要执行的命令写入到一个文件中,然后再通过执行这个文件来一次性执行所有的命令。
这个文件就是一个 Shell 脚本,它可以用来编写一些自动化的任务,比如安装软件、备份数据、系统的运维巡检等等。下面就来看一下如何编写一个最简单的 Shell 脚本。
首先我们使用文本编辑器来新建一个文件,可以使用任何你喜欢的编辑器,vi 或者 VS Code 都是可以的。给这个文件起一个名字,比如就叫做 hello.sh。Shell 脚本文件的扩展名一般以 .sh 结尾,但其实这只是一个约定俗成的规范,脚本文件可以是任何的扩展名,甚至没有扩展名都是没有问题的。但是一般来说还是建议使用 .sh 作为扩展名,这样可以让其他人一眼就知道这个文件是一个 Shell 脚本文件。
Shell 脚本文件的第一行一般是一个井号感叹号,后面加上一个 /bin/bash(#!/bin/bash),用来表示这个脚本文件使用的是 Bash 解释器。这样当我们执行这个脚本文件的时候,系统会自动调用 Bash 来解释执行。当然如果想要使用其他 Shell 解释器的话,也可以把 /bin/bash 替换成其他 Shell 解释器的路径。比如想要使用 zsh 的话,就可以把后面的路径替换成 /bin/zsh,这样系统就会自动调用 zsh 来解释执行这个脚本文件。
然后我们可以在文件中输入一些命令,这些命令就可以按照顺序依次执行。比如可以使用 echo 命令来打印一些信息,来打印一个 "hello shell",后面加上一个 date 命令用来显示当前的日期和时间,再加上一个用来显示当前用户的命令。代码编写完成之后保存一下,然后来执行一下这个脚本。
执行的方式是在命令行中输入点号斜线(./),然后加上脚本文件的名称就可以了。这里需要注意的是,在 Linux 系统中,我们想要执行一个文件的话,必须要有执行权限。可以使用 chmod 命令来给这个文件添加一下执行权限,然后再来执行一下这个脚本文件。可以看到输出了我们刚刚写入的信息之后,也显示了当前的日期、时间和用户名。这就是一个最简单的 Shell 脚本的执行过程。
使用 ChatGPT 生成 Shell 脚本示例
Shell 脚本的功能是非常强大的,它支持分支、条件判断和循环等等很多在编程语言中才有的特性,也可以定义函数和变量,可以调用系统命令以及其他程序,还可以进行文件读写等操作,可以说是非常强大的一个工具。使用好了可以大大提高我们的工作效率。
下面我们就来使用 ChatGPT 来生成一个比较完整的 Shell 脚本。我们让它来编写一个适合于演示和学习 Shell 脚本的示例程序。生成的过程还是需要一点时间的,大家耐心等待下。
好的,已经开始生成了。它首先生成了一个函数,用来检查一个数是否为素数。Shell 脚本也是支持函数的。在函数里面使用了一个 local 变量。Shell 脚本中的变量默认是全局的,这一点是和 C++ 或者 Java 这些高级语言不太一样的地方。也就是说它的作用域是从定义的地方开始,一直到脚本结束。如果想要在函数中定义一个局部变量的话,就需要在变量前面加上一个 local 关键字,这样它的作用域就只在函数内部有效了。
$1 表示函数的第一个参数,也就是我们要检查的数字。然后下面是一个 if 条件语句,用来判断这个数字是不是小于二。-lt 是小于的意思,类似的还有 -gt 也就是大于,-eq 表示 equal,还有 -le 和 -ge 分别表示小于等于和大于等于。脚本中 if 语句的写法是比较严格的,两个中括号的两边都需要有空格,否则会因为语法错误而无法执行。
然后是一个 for 循环,用来检查从二到这个数的平方根之间所有的数字,看看这个数能不能被整除。如果能被整除的话,就说明这个数不是素数。for 循环的格式也是比较严格的,使用两个小括号把里面的三个表达式都括起来,这个同其他语言中的 for 循环也是比较类似的,这里就不再赘述了。
好的,生成完成了。我们来复制一下这个脚本的内容,然后打开一个 VS Code 粘贴进去。在 VS Code 中也可以打开一个终端,然后在终端中直接输入 sh 加上脚本文件的名称就可以了。它提示我们输入一个正整数,那我们先来输入一个 10,回车之后就会提示我们 10 不是一个素数。那我们再来执行一下,这次我们输入一个 7,回车之后就会提示我们 7 是一个素数。
这就是一个关于脚本的简单示例。它里面包含了一些 Shell 脚本的基本语法和功能,比如使用井号开头的行表示的注释,如何定义和调用一个函数,如何使用 read 命令来读取用户的输入,如何使用 if 语句来进行条件判断,以及如何使用 for 语句来进行循环操作等等。这些都是 Shell 脚本中非常常用的一些功能。希望大家可以通过这个例子了解 Shell 脚本的一些基本用法,然后可以根据自己的需求来编写一些更加复杂的脚本。
编写猜数字小游戏与编辑器推荐
上节课我们了解了 Shell 的一些基础知识和基本概念,这节课我们就来从头开始编写一个猜数字的小游戏。通过一点点丰富这个小游戏的过程,来详细学习一下 Shell 的各种功能。希望通过这个小游戏的案例,可以让大家快速掌握 Shell 的使用方法。那话不多说,我们直接开始吧。
首先我们连接到 Linux 环境之后,使用 vi 或者其他编辑器新建一个文件。在上一节课中,我们讲解过 vi 编辑器的使用方法,但是有的同学反馈说 vi 对于新手来说还是比较难用。那这节课再给大家推荐两个更简单的方式。
第一种是使用 VS Code 的远程 SSH 连接扩展。打开 VS Code 之后,在扩展商店中搜索 Remote-SSH,找到之后安装一下。安装完成之后,在界面左边就会多出来一个远程连接的图标,可以在这里添加和配置一个新的 SSH 连接。然后就可以直接在 VS Code 中连接到远程服务器上,而且也可以打开一个终端直接在远程服务器上执行命令,非常的方便。
另一种方式是使用 nano 这个编辑器,相对于 vi 来说它更加简单。只需要在命令行输入 nano 之后加上我们要打开的文件名,不需要记一些复杂的命令和快捷键。下面就来简单演示一下。
打开命令行终端之后,输入 nano 加上一个文件名,比如我们要做一个小游戏的话,就可以叫做 game.sh,然后就可以打开一个编辑器。在这里我们可以输入一些内容,第一行是固定的 #!/bin/bash,表示这个文件默认使用 Bash 解释器来执行。然后再输入一些内容,比如可以用来提示用户输入一个用户名,那么就可以输入 echo 之后,后面加上一个 "请输入您的姓名"。这个时候我们就可以使用一个 read 命令来读取用户的输入,再把输入的内容赋值给一个变量 name。这样 name 中就存储了用户输入的名字,后面在需要的时候就可以直接使用这个变量了。
我们来使用 echo 来打印一下这个名字,输入 echo 之后,后面加上一个 "你好 $name"。编辑完成之后,按下 Ctrl+S 保存退出,然后输入 Y 确认保存。这样我们就使用 nano 编辑器完成了一个最简单的脚本文件。
下面我们就来执行一下这个脚本文件。执行的方式有两种,可以输入 sh 之后后面加上脚本文件的名称,也可以输入一个点号斜线(./)之后再加上脚本文件的名称。这两种方式还是有一点小区别的。后面直接执行的这种方式,需要给这个脚本文件添加一个执行权限。输入 chmod +x 之后再加上脚本文件的名称就可以了。关于权限的问题,我们在 Linux 的第一节课中也有讲解过,第一次接触的同学可以去看一下我们上节课的视频。
执行之后就会提示我们输入一个名字,我们输入一个 Geeker,然后回车可以看到输出了 "你好 Geeker"。这样我们就完成了一个最简单的交互式脚本文件的编写和执行的过程。
脚本参数与特殊变量
除了使用 read 命令来交互式地读取用户的输入之外,我们也可以给这个脚本文件传递一些参数。这些参数可以在脚本文件中使用 $ 加上数字序号的方式来引用。还记得在上一节课中,我们提到过一个 $0 吗?它表示当前正在执行的脚本文件的名称。那后面的 $1、$2、$3 等等,就表示传递给这个脚本的第一个、第二个和第三个参数。
那我们来演示一下。打开脚本文件之后,把里面的内容稍微修改一下,把 read 命令读取用户输入的这一行注释掉,在这一行的最前面加上一个井号。在脚本文件中以井号开头的行表示注释。然后使用 $1 来给 name 变量赋值,再加上一个 channel 参数,表示频道的名称。最后再把 echo 命令中输出的内容也来修改一下,加上 "欢迎来到这个频道" 的提示。保存之后,我们再来执行一下。
输入脚本文件的名称之后,后面加上一个表示姓名的第一个参数 "老杨",和一个表示频道的参数 "Geeker",然后回车执行一下。可以看到输出了我们想要的结果。这样我们就可以通过参数来给脚本文件传递一些信息。当我们不能交互式地输入,或者需要自动化地执行一些操作的时候,这种方式就非常的有用了。
另外在 Shell 脚本中还有一些特殊的变量,比如 $# 表示传递给脚本的参数的个数,$? 表示上一个命令的返回值等等。这些变量在编写脚本的时候也经常会遇到,大家可以自己尝试一下。
环境变量与配置文件
这里还有一个问题,就是每次执行脚本的时候,都需要输入用户名和频道名称,有一点麻烦。我们可不可以把这些信息保存到一些变量中,让脚本文件自动读取这些信息呢?当然是可以的,就是使用环境变量。
在上节课的时候,我们已经接触过一些环境变量,比如 HOME 和 SHELL 变量等等。这些变量是系统预先定义好的,我们也可以自己定义一些变量。比如可以在命令行中使用赋值的方式来定义 name 和 channel 这两个变量。输入 name=老杨,channel=Geeker,然后再使用 echo 命令来查看一下这两个变量的值,可以看到也是没有问题的。
接下来再来修改一下脚本文件,把给变量赋值的这两行注释掉。因为刚刚在命令行中已经定义了这两个变量,所以可以试一下能不能直接在脚本文件中使用它们。保存之后再来执行一下,我们并没有输入任何参数,但是结果也并没有像我们预料的那样输出了名字和频道。
这里稍微解释一下,我们在命令行中确实定义了 name 和 channel 这两个变量,但是这两个变量只是一个普通的变量,并不属于环境变量,它们也只是在当前的 Shell 会话中有效。在脚本文件中直接引用的话,是无法获取到它们的值的。解决的办法是可以使用 export 命令,把这两个变量转换为环境变量,这样在脚本文件中就可以获取到了。
下面我们来演示一下。还是在命令行定义这两个变量,但是这次我们在前面加上一个 export 命令:export name=老杨,然后再 export channel=Geeker。然后再重新执行一下脚本文件,可以看到这次就正常输出了我们想要的结果。
另外还有一个经常会遇到的问题,就是使用 export 定义的环境变量只在当前 Shell 会话中有效,退出之后就会失效。比如使用 exit 命令退出当前的 Shell 会话之后,再重新登录一下,再来执行一下脚本文件,就会发现这两个变量的值又变成空的了。直接使用 echo 命令来查看一下也是空的,说明这两个变量已经失效了。
那有没有什么办法可以让这些环境变量永久有效呢?当然是可以的。Shell 会在启动的时候读取一些配置文件,最常见的就是用户家目录下的 .bash_profile 和 .bashrc 这两个文件。注意这两个文件是隐藏的,在 Linux 中所有以点号开头的文件都是隐藏文件,直接使用 ls 命令是看不到的,可以在 ls 命令后面加上一个 -a 选项表示显示所有文件。
这两个文件都可以用来存储一些环境变量,只不过 .bash_profile 是在用户登录的时候执行的,并且只执行一次;而 .bashrc 文件是在每次打开一个终端或者新建一个 Shell 会话的时候执行的。不同 Shell 的配置文件可能会有一些差异,比如 zsh 的配置文件是 .zshrc 文件,fish 的配置文件是 config.fish,但是原理基本上是相同的。通常 .bash_profile 里面会调用 .bashrc,所以一般推荐把环境变量放到 .bashrc 文件中,这样就可以保证每次新打开一个终端的时候,都可以获取到这些环境变量了。
另外除了用户家目录下的这两个文件之外,系统根目录下也会有一些系统级别的配置文件,比如根目录 /etc 文件夹下的 profile 和 bashrc 文件等等。这些文件里面存储的环境变量是对所有用户都有效的。
下面我们就来把 name 和 channel 这两个变量放到 .bashrc 文件里面。使用 nano 来打开 .bashrc 文件之后,滚动到文件的最后面,在最后来定义和导出一下这两个变量,然后保存退出。注意这里有个小提示,也是很多同学经常会遇到的问题,就是在修改 .bashrc 文件之后,需要使用 source 命令或者一个点号来重新加载一下这个文件,或者直接退出当前 Shell 会话,然后再重新登录一下,让系统来重新读取一下配置文件,这样环境变量才会生效。
我们来重新登录一下。登录之后,再使用 echo 来查看一下这两个变量的内容,可以看到这次不是空的了。再来执行一下脚本文件,也输出了我们想要的结果。
.bashrc 文件中除了可以存储环境变量之外,还可以定义一些别名来简化一些命令的使用。比如在默认的 .bashrc 文件中,就定义了 ls 命令的一些别名,包括 ll、la 和 l 等等。当然也可以在这里定义一些自己的别名,大家有哪些习惯使用或者特别好用的别名,可以发到评论区或者弹幕上来一起分享一下。
生成随机数与命令替换
下面回到我们的猜数字游戏。我们需要生成一个 10 以内的随机数,然后让用户来猜这个数字。每次用户输入之后,我们会给出一些提示,如果猜对了游戏就结束,如果猜错了就继续。
这里我们会遇到一些新的问题。第一个就是如何生成一个随机数。在 Linux 中有很多生成随机数的方法,我们可以使用一个专门用来生成随机数的命令 shuf。输入 shuf 之后,后面加上一个 -i 1-10 表示生成的范围,再加上一个 -n 1 表示生成的个数。来执行一下,输出了一个 1 到 10 之间的数字。再来执行一下,可以看到每次执行之后这个数字都是会变的。
下面来把这个生成随机数的处理加入到脚本文件中。我们来复制一下这行命令,然后打开脚本文件粘贴进去,再把这个随机数赋值给一个变量,比如就叫做 number。再来使用 echo 命令来打印一下这个变量。保存退出之后再来执行一下。
看看这时候报错了,提示我们找不到 shuf 这个命令。回到脚本中看一下这一行,这是因为当我们想要把一个命令的输出结果赋值给一个变量的时候,需要使用到命令替换语法,也就是反引号或者 $ 加上一对小括号把这个命令括起来。这样 Shell 才会把这个命令的输出结果当成一个整体来处理。我们把这行命令前后都加上反引号之后,再来执行一下,可以看到这次就没有问题了。
我们换成 $() 的方式再来试一下。这里有个小提示,就是使用命令替换语法的时候,尽量使用 $() 这种更加现代化的方式,在可读性和灵活性方面比反引号都更好。可以看到也是没有问题的。这样生成随机数的部分就完成了。
条件判断与多分支
下面来加上一段打印内容,用来提示用户输入一个 1 到 10 之间的数字。输入 echo 之后加上 "请输入一个 1 到 10 之间的数字",然后使用 read 命令来读取用户的输入,并把它赋值给一个变量,比如就叫做 guess。
下面需要比较一下用户输入的数字和生成的随机数是否相等。如果相等的话,就提示用户猜对了,否则就提示用户猜错了。这里就需要用到条件判断,也就是 if 语句了。if 语句的格式是 if 后面加上一个条件,这个条件需要使用两个中括号把它括起来,后面再加上一个分号和 then。然后在下面加上一些命令,这些命令就会在这个条件成立的时候被执行。最后再加上一个 fi 来结束这个 if 语句。
我们来演示一下。if 后面加上两个中括号,再加上一个分号和 then,回车之后再加上一个 echo 命令打印一个 "猜对了" 的提示,最后再加上一个 fi 表示这个 if 语句的结束。在两个中括号中间的就是判断条件了。我们需要判断用户输入的数字和生成的随机数是否相等,也就是用户输入的 guess 变量和随机生成的 number 变量,中间使用一个 -eq 表示 equal,也就是相等的意思。这样条件判断就完成了。
保存退出之后再来执行一下。这里由于上面生成的随机数已经被打印了出来,相当于我们提前知道了答案。为了演示方便,我们先保留这个打印的部分,可以直接输入这个数字来测试一下。回车之后可以看到输出的提示。再来执行一下,这次我们输入一个错误的数字,可以看到没有输出任何内容,说明条件判断是正确的。
那如果用户猜错了,我们也需要给出一些提示的话,可以在 if 语句的下面再加上一个 else 分支,然后在下面加上一个 echo 打印一个 "猜错了"。再来执行一下,输入一个错误的数字,可以看到输出了猜错了的提示。
我们再来完善一下,比如用户猜错的时候给出一些提示,来告诉用户猜的数字是大了还是小了。这里就需要使用到另外一种多分支的条件判断格式。可以在 if 和 else 分支之间加上一个 elif,然后在后面使用两个中括号也加上一个条件。条件的内容是如果用户输入的数字 guess 小于生成的随机数的话,就打印输出一个 "太小了" 的提示。当然最后一个 else 分支也就是用户猜大了的情况,我们把提示内容也改成 "太大了"。这里小于和大于的符号分别是 -lt 和 -gt。
保存之后再来执行一下,输入一个小于随机数的数字,提示我们小了;再来输入一个大一点的,提示大了。
循环控制与逻辑运算
这里还有个小问题,就是这个脚本只能执行一次,猜错了就结束了。我们希望用户可以一直猜下去,直到猜对为止。这里就需要使用到循环了。在 Shell 脚本中有两种常用的循环,一种是 for 循环,一种是 while 循环。for 循环可以用来遍历一些列表或者数组,while 循环则是在条件成立的情况下一直执行。
在上一节课 ChatGPT 生成的脚本中已经演示过了 for 循环,这里我们使用 while 循环来实现下这个功能。输入 while 之后,后面加上两对中括号,然后在中括号里面加上一个判断条件。条件的内容就是用户输入的数字 guess 不等于生成的随机数,也就是说只要用户没有猜对的话,就一直循环。然后在下面加上一个 do 来表示循环的开始,在循环的最后再加上一个 done 表示循环的结束。这样就完成了一个 while 循环。
然后保存退出之后再来执行一下。先来输入一个错误的数字,可以看到输出了猜错了的提示。再来输入一个正确的数字,可以看到输出了猜对了之后,程序就结束了,说明循环已经生效了。
这里还有一个小问题,就是每次猜对之后,程序就直接结束了。我们希望用户可以自己选择是否继续。这里就需要使用到一个新的语法,就是 break 和 continue。break 可以用来结束循环,continue 可以用来跳过当前循环。
我们在用户猜对之后加上一个提示,使用 echo 打印一个 "恭喜你猜对了,请选择是否继续",然后使用 read 命令来读取用户的输入之后赋值给一个变量,比如就叫做 choice。然后在下面使用一个 if 语句来判断用户的选择。如果用户选择的是 Y 的话,就继续循环,也就是 continue;否则就使用 break 来结束循环。
这里还有个需要修改的地方,就是 while 后面的循环条件也需要改成一个 true,也就是一直为真的条件。否则第一次猜中数字之后,无论用户选择的是 Y 还是 N 都会直接结束循环。另外需要注意一下,这个 true 的两边并不需要加上中括号。
保存之后再来执行一下。输入一个正确的数字,可以看到输出了让我们选择是否继续的提示。我们输入一个 Y,可以看到游戏并没有结束,而是又开始了一轮。再来输入一下,选择 N 的话就会结束游戏。
这里还有个小问题,就是用户输入 Y 或者 N 是区分大小写的。如果用户输入的是大写的 Y 或者 N 的话,程序并没有进行判断和处理。打开程序来修改一下,把这里的条件修改为当用户输入的是小写 Y 或者大写 Y 的时候,都继续循环,其他情况都结束循环。
在 Shell 脚本中,也可以像很多其他编程语言一样,使用逻辑运算符来连接多个条件。比如可以使用两个竖线(||)来表示或者,也就是只要有一个条件成立就可以。这里就可以在原来的条件后面加上两个竖线,然后再加上一个判断条件,也就是用户输入的内容是大写的 Y 的话也会继续游戏。保存之后再来执行一下。输入一个正确的数字,然后输入一个大写的 Y,游戏继续了。再来一次,输入一个正确的数字,然后输入一个小写的 Y,也继续了。
使用 RANDOM 变量与进阶应用
最后还有一个小问题,就是每次继续之后需要重新生成一个随机数。可以直接把上面的 shuf 命令这一行复制过来,然后把它赋值给 number。
这里再给大家介绍另外一种方法,就是使用 RANDOM 这个系统变量。这个变量会在每次调用的时候生成一个 0 到 32767 之间的随机数。我们先回到命令行,使用 echo 命令来打印一下这个变量的值。再来执行一下,可以看到每次执行的时候这个数字都是会变的,范围是 0 到 32767。
那如果想要生成一个 1 到 10 之间的随机数应该怎么办呢?聪明的小伙伴们肯定已经想到了,我们加上一个取模运算就可以了。但是直接在后面加上一个模 10 是不行的,需要使用两个小括号把这个表达式括起来,这样才会把括号里面的表达式当成一个整体来计算。最后还需要加上一个 1,否则取到的就是 0 到 9 之间的随机数。再来执行一下,可以看到也成功输出了一个 1 到 10 之间的随机数。
那么我们再打开脚本文件,在 continue 这一行的上面加上一个重新生成随机数的处理,也就是把刚刚的表达式赋值给 number。为了方便演示,我们在这里把这个随机数打印一下。保存退出之后再来执行一下。输入一个正确的数字,然后继续游戏;再来猜一下,然后继续。可以看到每次继续游戏的时候,都会重新生成一个随机数。这样我们的猜数字游戏就基本完成了。
这节课我们通过从头开始编写一个小游戏的过程,了解了 Shell 脚本中的一些基本语法和功能。当然 Shell 脚本还可以做很多其他的事,比如可以配合 grep、awk 和 sed 等命令来进行文本处理,可以使用函数和数组这些高级语言才有的程序特性,也可以结合使用各种命令来进行系统管理和监控,可以说是一个非常强大的工具。
以上就是本期视频的所有内容,我们下期再见。