一、shell简介
shell可直译为“贝壳”。贝壳是动物作为外在保护的一种工具。可以理解为:Linux中的 shell就是 Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。
命令是用户向系统内核发出控制请求,与交互的文本流。而 shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为 shell脚本文件,交给 shell批量执行。
最初的 UNIX shell经过多年的发展,由不同的机构、针对不同的目录,开发出许多不同类型的 shell程序,目前流行的 shell主要有以下几种:
- Bourne Shell(sh):由 AT&T的 Steve Bourne开发,是第一个流行的 shell,是 UNIX上的标准 shell。不过 sh的作业控制功能薄弱,且不支持别名与历史记录等功能
- C Shell(csh):sh之后另一个广为流传的 shell,由柏克莱大学的 Bill Joy设计,语法有点类似 C语言,其内部命令有52个,较为庞大。但目前使用的不多
- Korn Shell(ksh):由AT&T 的David Korn开发,语法与 sh相同,同时具备 csh的易用特点。许多安装脚本都使用 ksh,有42条内部命令,但与 bash 相比有一定的限制性
- Bourne Again Shell(bash):由 GNU组织开发,保持了对 sh的兼容性,是各种Linux发行版默认配置的shell。能够提供环境变量以配置用户 shell环境,支持历史记录,内置算数功能,支持通配符表达式,将常用命令内置简化
二、shell命令格式
2.1 shell命令提示符
shell提示符标识了命令行的开始。用户在提示符后面输入一条命令并按Enter键,完成向系统提交命令。通常shell命令提示符采用以下的格式:
username@hostname:direction$
用户名 主机名 目录名
- username:用户名,显示当前登录用户的账户名 (执行的命令 whoami)
- hostname: 主机名,显示登录的主机名(执行的命令hostname)
- direct体on: 目录名,显示当前所处的路径,根目录下显示为“/”,主目录下显示为“~“(执行的命令是pwd)
2.2 shell命令格式
通常一条 shell命令包含三个要素:命令名称、选项、参数。命令名称是必须的,选项和参数都可选项。格式如下:
$ Command [-Options] Argument1 Argument2...
指令 选项 参数1 参数2 ...
- KaTeX parse error: Expected 'EOF', got '#' at position 23: …示符,若为超级用户,提示符为“#?”,其他用户的提示符均为“”
- Command:命令名称,shell命令或程序,严格区分大小写
- Options:命令选项,用于改变命令执行类型,由“-”引导,可同时带多个选项
- Argument:命令参数,指出命令作用的对象或目标,允许带多个参数
一条命令的三要数之间用空格隔开;若将多个命令在一行书写,用分号(;)将各命令隔开;如果一条命令不能在一行写完,在行尾使用反斜杠(\)表明该条命令未结束。
2.3 shell命令初体验
使用shell命令,关闭或重启系统
sudo shutdown -h now
sudo shutdown -r now
sudo reboot now
sudo shutdown -h +45 "That is all!"
sudo shutdown -r +60
三、shell中的特殊字符
3.1 shell中的通配符
当需要用命令处理一组文件,例如 file.txt、file2.txt、file3.txt…,用户不必一一输入文件名,可使用 shell通配符。shell命令的通配符含义如下表
通配符 | 含义 | 实例 |
---|
* | 匹配任意长度的字符串 | 用file_*.txt ,匹配file_wan.txt、file_zhou.txt、file_li.txt | ? | 匹配一个长度的字符 | 用file_?.txt ,匹配file_1.txt、file_2.txt、file_3.txt | […] | 匹配其中指定的一个字符 | 用file_[ota].txt ,匹配file_o.txt、file_a.txt和file_t.txt | [ - ] | 匹配指定的一个字符范围 | 用file_[a-z].txt ,匹配file_a.txt、file_b.txt,直到file_z.txt | [^…] | 除了其中指定的字符均可匹配 | 用file_[^ota].txt ,除了file_o.txt、file_t.txt、file_a.txt的其它文件 |
3.2 shell中的管道
管道可以把一系列命令链接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。就像通过使用“|”符连成一个管道。
ls /use/bin | wc -w
1249
以上操作中,借助管道“|”,将ls的输出直接作为wc命令的输入。使用管道可以巧妙的将一些命令联合使用,得到单个命令所无法实现的效果。例如使用以上的命令组合,得到的是==/usr/bin==目录下文件的个数。
3.3 输入输出重定向
输入/输出重定向是改变shell命令或程序默认的标准输入/输出目标,重新定向到新的目标。linux中默认的标准输入定义为键盘,标准输出定义为终端窗口。用户可以为当前操作改变输入或输出,迫使某个特定命令的输入或输出来源为外部文件
重定向符 | 含义 | 实例 |
---|
> file | 将file重定向为输出源,新建模式 | ls /usr > lsoutput.txt ,将ls /usr的执行结果,写到lsoutput.txt中,若有同名文件将被删除 | >> file | 将file重定向为输出源,追加模式 | ls /usr >> lsoutput.txt ,将ls /usr的执行结果,追加到lsoutput.txt已有内容后 | < file | 将file重定向为输入源 | wc < file1 ,将file1中的内容作为输入传给wc命令 | 2> 或 &> | 将产生的错误信息输入到文件中 | ls xxx.txt 2> err.log ,使用ls命令查看一个不存在的文件时,将错误提示保存在err.log中 |
cat命令功能为在标准输出上显示文件。下面通过一个实例,可以更好地理解重定向的功能:
linux@ubuntu:~/andyxi$ cat
have a good day!
have a good day!
linux@ubuntu:~/andyxi$ cat > file1.txt
have a good day!
linux@ubuntu:~/andyxi$ cat < file1.txt
have a good day!
3.4 命令置换
命令替换是将一个命令的输出作为另一个命令的参数。命令格式如下所示。
command1 `command2`
其中,命令command2的输出将作为命令command1的参数。需要注意,命令置换的单引号为ESC键下方的“`”键
linux@ubuntu:~$ ls `pwd`
Desktop Examples historycommandlist andyxi
pwd命令用于显示当前目录的绝对路径。在上面的命令行中,使用命令置换符,将pwd的运行结果作为ls命令的参数。最终,命令执行结果是显示当前目录的文件内容。
|