Shell基础
Shell是什么?
Shell是一个命令解释器,伪用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止、编写一些程序;
Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强;Shell世界是执行的脚本语言,在Shell中可直接调用Linux系统命令
Shell的分类
在UNIX/Linux系统中,常用的Shell有3种,分别是Bourne shell(AT&T shell,在 Linux 下是bash)、C shell(Berkeley shell,在 Linux 下是tcsh)和 Korn shell(Bourne shell的超集);这3种 shell 在交谈(interactive)模式下的表现相当类似,但作为命令文件语言时,在语法和执行效率上就有些不同了
Bourne shell 是第一个有重要意义的标准的 UNIX shell, V7(AT&T的第七版)UNIX是在1979 年底被提出,且以它的创造者 Stephen Bourne 来命名。Bourne shell 以 Algol语言为基础来设计,主要被用来做自动化系统管理工作;虽然 Bourne shell 以简单和速度而受欢迎,但它缺少许多交谈性使用的特色,例如历程、别名和工作控制;大部份的系统管理命令文件,例如 rc start、stop 与shutdown 都是Bourne shell 的命令档,且在单一使用者模式(single user mode)下以 root 签入时它常被系统管理者使用;Bourne shell 是由 AT&T 发展的,以简洁、快速著名。 Bourne shell 提示符号的默认值是 $
C shell 是在加州大学柏克来分校于70年代末期发展而成,而以2BSD UNIX的部分发行。这个 shell 主要是由 Bill Joy 写成,提供了一些在标准 Bourne shell 所看不到的额外特色,在交谈式运用上作了一些改进,如命令列历程(history)、别名(alias)、内建算术、档名完成(filename completion)、和工作控制(job control)。C shell 是以C 程序语言作为基础,且它被用来当程序语言时,能共享类似的语法。因为 C shell 是在大型机器上设计出来,且增加了一些额外功能,所以 C shell在小型机器上跑得较慢,即使在大型机器上跟 Bourne shell 比起来也显得缓慢。C shell 提示符号的默认值是 %
Korn shell 是Bourne shell 的超集(superset),由 AT&T 的 David Korn 所开发。它增加了一些特色,比 C shell 更为先进。Korn shell 的特色包括了可编辑的历程、别名、函式、正规表达式万用字符(regular expression wildcard)、内建算术、工作控制(job control)、共作处理(coprocessing)、和特殊的除错功能。Bourne shell 几乎和 Korn shell 完全向上兼容(upward compatible),所以在 Bourne shell 下开发的程序仍能在 Korn shell 上执行。在 Linux 系统使用的 Korn shell 叫做 pdksh,它是指 Public Domain Korn Shell。Korn shell 提示符号的默认值也是 $
可以查看自己的系统都支持哪些Shell,查看/etc/shells文件即可
Shell脚本的执行方式
第一个Shell脚本
vi hello.sh #!/bin/bash #第一个脚本 echo 'Hello World!'
wq保存退出,上述代码中,第一行的#!/bin/bash用以标称以下程序是Shell脚本,然后该脚本输出了一句话Hello World!
有两种方法执行脚本
1)bash hello.sh
2)系统创建文件默认没有可执行权限,给文件赋以可执行权限,然后通过绝对/相对路径调用脚本
chmod 755 /tmp/shell/hello.sh
/tmp/shell.hello.sh
bash基本功能
历史命令
history [选项] [历史命令保存文件]
-c 清楚历史命令,包括缓存中的历史命令及历史命令保存文件(~/.bash-history)中的命令
-w 将缓存中的历史命令写入历史命令保存文件
说明:默认只有用户退出系统时,才会将缓存中的历史命令存入历史命令保存文件,历史命令默认保存1000条,可在环境变量配置文件/etc/profile中修改,超出1000条,会删除最前面的历史命令,保存新的历史历史命令
历史命令的调用
1)使用上下箭头调用之前的历史命令
2)用!n重复执行第n条历史命令
3)!!重复执行上条命令】
4)"!字串"重复执行最后一条以该字串开头的命令
命令补全
tab键自动补全路径、文件名等
别名
临时设定命令别名 alias 别名="原命令"
永久设定命令别名 vi /家目录/.bashrc
查询命令别名 alias 别名
删除别名 unalias 别名
命令执行优先级的顺序
1)第一优先用绝对路径或相对路径执行的命令
2)第二优先级是别名
3)第三优先级为bash内部命令
4)第四优先级按照$PATH环境变量定义的目录查找顺序找到的第一个命令
bash常用快捷键
ctrl+a 把光标切到命令行开头
ctrl+e 把光标切到命令行末尾
ctrl+c 强制终止当前命令
ctrl+l 清屏,相当于clear命令
ctrl+u 删除或剪切光标之前的命令
ctrl+k 删除或剪切光标之后的命令
ctrl+y 粘贴ctrl+u或ctrl+k剪切的内容
ctrl+r 在历史命令中搜索,按下ctrl+r后,就会出现搜索界面,只要输入搜索内容,就会在历史命令中搜索
ctrl+d 退出当前终端
输入输出重定向
标准输入输出设备
设备 |
设备文件名 |
文件描述符 |
类型 |
键盘 |
/dev/stdin |
0 |
标准输入 |
显示器 |
/dev/sdtout |
1 |
标准输出 |
显示器 |
/dev/sdterr |
2 |
标准错误输出 |
输出重定向即将本来应该经标准输出显示在显示器上的内容写入文件;输入重定向即本来由键盘输入改为有文件输入
输出重定向
类型 |
符号 |
作用 |
标准输出重定向 |
命令>文件 |
以覆盖方式,将命令的正确输出输出到指定的文件或设备中 |
命令>>文件 |
与上述的不同在于是以追加方式 |
|
标准错误输出重定向 |
错误命令 2>文件(>左右无空格) |
以覆盖方式,将命令的错误输出输出到指定的文件或设备中 |
错误命令 2>>文件(>>左右无空格) |
与上述的不同在于是以追加方式 |
|
正确输出和错误输出同时保存 |
命令 > 文件 2>&1 |
以覆盖方式,将命令的正确和错误输出输出到指定的文件或设备中 |
命令 >> 文件 2>&1 |
与上述的不同在于是以追加方式 |
|
命令 &>文件 |
以覆盖方式,将命令的正确和错误输出输出到指定的文件或设备中 |
|
命令 &>>文件 |
与上述的不同在于是以追加方式 |
|
命令>>文件1 2>>文件2 |
把正确输出追加到文件1,把错误的输出追加到文件2 |
多命令执行
1)命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
2)命令1&&命令2 命令1正确执行,命令2才会执行;命令1执行不正确,命令2不会执行
3)命令1||命令2 命令1正确执行,命令2不会执行;命令1执行不正确,命令2才会执行
管道符|
命令1|命令2 命令1的正确输出作为命令2的操作对象
通配符
1)? 匹配一个任意字符
2)* 匹配0个或任意多个字符
3)[] 匹配中括号中的任意一个字符,如:[abc]代表一定匹配一个字符,或是a,或是b,或是c
4)[-] 匹配中括号中任意一个字符,-代表一个范围,如:[a-z]代表匹配一个小写字母
5)[^] 匹配的内容不是中括号中的任意一个字符,如:[^0-9]代表匹配一个不是数字的字符
bash中其他特殊符号
1)'' 单引号,在单引号中所有的特殊符号,如$和`(反引号)都没有特殊含义
2)"" 双引号,在双引号中特殊符号没有特殊含义,"$"、"`"、"\"除外,分别表示“调用变量值”、“引用命令”、“转义”
3)` 反引号,反引号括起来的内容是系统命令,在bash中会先被执行,和$()作用一样,推荐使用$()
4)$() 和反引号作用一样,用来引用系统命令
5)# 在shell脚本中,#开头的行代表注释
6)$ 用于调用变量的值,如调用变量name的值,用$name的方式得到变量的值
7)\ 转义符