
shell
约 1110 字大约 4 分钟
2024-07-20
Bash 简介
Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。
Shell 的含义
学习 Bash,首先需要理解 Shell 是什么。Shell 这个单词的原意是“外壳”,跟 kernel(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面。
具体来说,Shell 这个词有多种含义。
首先,Shell 是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI)。Shell 接收到用户输入的命令,将命令送入操作系统执行,并将结果返回给用户。本书中,除非特别指明,Shell 指的就是命令行环境。
其次,Shell 是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用 Shell 命令写出各种小程序,又称为脚本(script)。这些脚本都通过 Shell 的解释执行,而不通过编译。
最后,Shell 是一个工具箱,提供了各种小工具,供用户方便地使用操作系统的功能。
Shell 的种类
Shell 有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell。
历史上,主要的 Shell 有下面这些。
Bourne Shell(sh) Bourne Again shell(bash) C Shell(csh) TENEX C Shell(tcsh) Korn shell(ksh) Z Shell(zsh) Friendly Interactive Shell(fish) Bash 是目前最常用的 Shell,除非特别指明,下文的 Shell 和 Bash 当作同义词使用,可以互换。
下面的命令可以查看当前设备的默认 Shell。
$ echo $SHELL
/bin/bash
当前正在使用的 Shell 不一定是默认 Shell,一般来说,ps 命令结果的倒数第二行是当前 Shell。
$ ps
PID TTY TIME CMD
4467 pts/0 00:00:00 bash
5379 pts/0 00:00:00 ps
上面示例中,ps 命令结果的倒数第二行显示,运行的命令(cmd)是 bash,表明当前正在使用的 Shell 是 Bash。
下面的命令可以查看当前的 Linux 系统安装的所有 Shell。
$ cat /etc/shells
上面三个命令中,$是命令行环境的提示符,用户只需要输入提示符后面的内容。
Linux 允许每个用户使用不同的 Shell,用户的默认 Shell 一般都是 Bash,或者与 Bash 兼容。
Bash 的基本语法
1. echo 命令
echo 命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。
2. 命令格式
命令行环境中,主要通过使用 Shell 命令,进行各种操作。Shell 命令基本都是下面的格式。
$ command [ arg1 ... [ argN ]]
上面代码中,command 是具体的命令或者一个可执行文件,arg1 ... argN 是传递给命令的参数,它们是可选的。
$ ls -l
上面这个命令中,ls 是命令,-l 是参数。
3. 空格
Bash 使用空格(或 Tab 键)区分不同的参数。如果参数之间有多个空格,Bash 会自动忽略多余的空格。
4. 分号
分号(;)是命令的结束符,使得一行可以放置多个命令,上一个命令执行结束后,再执行第二个命令。
5. 命令的组合符&&和||
除了分号,Bash 还提供两个命令组合符&&和||,允许更好地控制多个命令之间的继发关系。
Command1 && Command2
上面命令的意思是,如果 Command1 命令运行成功,则继续运行 Command2 命令。
Command1 || Command2
上面命令的意思是,如果 Command1 命令运行失败,则继续运行 Command2 命令。
下面是一些例子。
$ cat filelist.txt ; ls -l filelist.txt
上面例子中,只要 cat 命令执行结束,不管成功或失败,都会继续执行 ls 命令。
$ cat filelist.txt && ls -l filelist.txt
上面例子中,只有 cat 命令执行成功,才会继续执行 ls 命令。如果 cat 执行失败(比如不存在文件 flielist.txt),那么 ls 命令就不会执行。
$ mkdir foo || mkdir bar
上面例子中,只有 mkdir foo 命令执行失败(比如 foo 目录已经存在),才会继续执行 mkdir bar 命令。如果 mkdir foo 命令执行成功,就不会创建 bar 目录了。
版权所有
版权归属:tuyongtao1