Shell
1. Shell是什么?—— CLI、Terminal、Console、Shell 的区别与联系
CLI (Command-line Interface),即命令行界 面,与 GUI (Graphical User Interface),即图形用户界面相对。CLI/GUI 只是一种界面形式,对应着敲命令或点鼠标,并不代表着某类具体软件。
Terminal ,即终端,是人与计算机进行交互的接口。一台大型机可以连接很多终端机,用户在这些终端机上跟计算机进行交互,这些早期终端一般是电传打字机(TTY),电传打字机也是第一个 Unix 终端。因此,在历史上,终端是连接到计算机上的一种带输入输出功能的外设。
Console ,即控制台,是一个特殊的终端。这个终端的特殊之处在于,它是计算机自身的一个组成成分,是系统管理员的终端,拥有比普通用户的终端更大的权限。一台大型机一般只有一个控制台,却可以连接很多终端。在个人计算机上,由于你既能做一般工作,也能做管理员的工作,因此控制台与终端的界限也就消失了。
随着个人计算机的普及和进化,大型机时代专门的终端硬件早已消失,我们只用自己的键盘、鼠标来控制计算机。但是终端的思想保留了下来,变成了操作系统中的软件 —— 终端模拟器(如 Win32 控制台)。终端模拟器可以捕获你的键盘输入,发送至命令行程序,拿到输出结果后再调用图形接口,将输出渲染至屏幕上。由于人们除了在博物馆再也见不到 TTY 这样的终端硬件了,于是就直接称终端模拟器为终端。
特别的,由于在早期 Unix 多用户系统当中的终端都是 TTY,于是所有的终端硬件设备在 Unix/Linux 系统当中都以TTY命名,这一习惯延续至今。在现在,TTY 和终端设备已不再区分了。
Shell ,即“壳层”,是帮助用户与内核交互的一类程序。操作系统内核直接负责管理计算机硬件,处于操作系统最底层,由于其重要性是不能 轻易由用户直接操作的,因此需要有 Shell 程序来作为用户操作系统的入口。Shell 是一类程序,可以有 CLI 形式的(如 sh、bash、zsh;cmd、powershell 等),也可以有 GUI 形式的(如 Windows 资源管理器 explorer.exe 等)。
至于为什么叫“壳层”,看下面这张图或许就感觉有点形象了。
或许现在你仍有些困惑,我们再来梳理一下。在用户用键盘和鼠标输入后,终端(Terminal)将这些输入发送给你选用的壳层(Shell),Shell 解析你的命令发送给操作系统内核去执行,并把执行结果返回给终端,终端调用图形接口将结果显示到屏幕上。
以上基础知识我们有一些了解即可,目的是让我们跟计算机打交道时头脑更清楚。如果现在没搞清楚也不要紧,只要掌握下面的实用技能,就足以在日常工作中得心应手。
2. 常用 Shell 命令
3. Shell 脚本
Shell 脚本是一种在 Shell 中运行的脚本程序,由 Shell 作为脚本解释器,Shell 脚本的一行就相当于一个命令,也可以用分号分隔一行之中的不同命令。
3-1. Shell 脚本基础写法
注释
# hello!
变量
定义变量时,注意变量名和等号间不允许有空格。变量名也有限制,如只能包含英文字母、数字和下划线且不能以数字开头等。如:
a=1
引用变量时,注意要在变量名前加“$”符号。如:
echo $a
我们还可以查看环境变量。如显示家目录:
echo $HOME
删除变量用unset命令。如:
unset a
数组
定义数组:
array=(value0 value1 value2 value3)
读取数组元素:
echo ${array[0]}
使用 @ 符号可以获取数组中的所有元素:
echo ${array_name[@]}
分支
if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
循环
for循环语法格式:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while循环语法格式:
while condition
do
command
done
在循环中,也可以跟C语言一样使用break和continue。此外,还有until循环,但一般不用。
3-2. 运行 Shell 脚本
直接运行shell脚本
在确保脚本具有可执行权限的前提下,可以直接执行脚本。
./test.sh # 注意不能写成test.sh,否则会去环境变量中查找