什么是shell?
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的。
我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
CentOS7 默认shell 为 bash (Bourne Agin Shell)、zsh 、ksh 等。
Linux shell 分类:
bourne shell (/usr/bin/sh 、/bin/sh)
bourne again shell (/bin/sh)
C shell (/usr/bin/csh)
K shell (/usr/bin/ksh)
shell for root (/sbin/sh)
命令历史:
Bash拥有自动记录命令历史的功能,用户所执行的命令会在注销时自动记录到自己的家目录下的.bash_history 隐藏文件中。
查看这些命里历史记录的方法有很多,可以通过直接打开文件来查看,也可以通过键盘上下键进行上翻与下翻历史记录,还可以
通过history命令查看历史记录,所有的命令历史都有记录编号。命令历史能够记录的信息数量由HISTSIZE变量所决定。
CentOS7 默认通过/etc/profile 文件来定义HISTSIZE=1000,也就是最多可以记录最近所使用的1000条命令,当有第1001条命令执行时,第一条命令会被覆盖,可以通过 命令 history -c 清空所有命令历史记录。
① 上下键翻阅历史命令,找到合适的命令后直接按回车键就可以执行。
② 输入 !+ 【命令历史的关键字】 调用 历史记录中的命令
③ 输入 !+ n 调用 命令历史中第 几条命令
④ 通过 Ctrl + r 快捷键 打开搜索功能,接着 输入 关键字,即可在命令历史中搜索相关命令,按回车完成执行操作,如果没有没有搜索到合适的命令,可以通过ESC 键 退出 搜索。
⑤ !! 类似 上翻一次执行上一条命令。
命令补全及别名:
命令补全:tab 键 敲一下 敲两下 显示匹配的命令
参数补全:安装 bash-completion
别名:
查看系统的所有名别:命令alias
•各用户都有自己配置别名的文件 ~/.bashrc
• ls /etc/profile.d/
• 自定义的alias放到~/.bashrc
设置一个别名:alias vimens33='vim /etc/sysconfig/network-scripts/ifcfg-ens33' (临时性)
取消一个别名:unalias vimens33
永久性:echo "alias vimens33='vim /etc/sysconfig/network-scripts/ifcfg-ens33' " >> /etc/profile | ~/.bashrc(需要重启)
通配符与输入输出重定向:
通配符:
* 代表【0个或无穷个】任意字符
? 代表【一定有一个】任意字符
[] 代表【有一个在括号内】的字符(非任意字符)例如:[abcd] 表示 【一定有一个字符,可能是a、b、c、d、这四个字符中的一个】
[-] 若有-减号在中括号内时,表示[在编码顺序内的所有字符] 例如[0-9] 代表0-9之间的所有数;[a-z] 代表a-z之间所有字母。
[^] 若中括号内第一个字符为符号 (^) ,那表示 [反向选择],例如 [^abc] 代表 一定有一个字符,要是非 a, b, c 的其他字符就行。
{} 表示符合括号内包含的多个文件
输出输入重定向:
输入输出标准说明
STDIN 标准输入 默认的设备是键盘 文件编号为:0
STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件
STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件
输出定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上
重定向输出使用”>” “>>” 操作符号
语法: > 文件名 #表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容
>> 文件名 #表示将标准输出的内容,追加到后面的文件中。若重定向的输出的文件不存在,则会新建该文件
输入定义:命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入
例如:grep root /etc/passwd 等价于 grep root < /etc/passwd
EOF
EOF本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。(右边跟一对终止符。终止符是可以自定义)
例如:
错误重定向
将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器
作用:错误信息保存到文件
操作符: 错误重定向符号:2> ; 标准输出: 1< 或简写 < ; 标准输入: 0> 或 >
在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。
注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符
管道符 与 作业控制:
管道符:可以将多条命令连接在一起使用,它的作用是将一个命令的标准输出重定向给下一个命令,并作为该命令的标准输入。
语法:command-a | command-b | command-c | ......
注意:
1、管道命令只处理前一个命令正确输出,不处理错误输出
2、管道右边的命令,必须能够接收标准输入的数据流命令才行
3、管道符可以把两条命令连起来,它可以链接多个命令使用
作业控制:
概述:
Bash环境中通过命令开启进程的时候使用&符可以使该进程进入后台执行,或者一个命令执行后使用快捷键Ctrl +Z 将该进程放入后台暂停执行,以后随时可以使用jobs命令查看这些后台进程,并且会为每个这样的进程分配一个编号,通过fg<编号>的形式可以将这些后台的进程再次回调前台执行。
常用快捷键:
Ctrl + a 光标移动至首行
Ctrl + e 光标移动至行尾
Ctrl + f 光标右移一个字符
Ctrl + b 光标左移一个字符
Ctrl + l 清屏 等同命令 clear
Ctrl + u 删除光标至行首的字符
Ctrl + k 删除光标至行尾的字符
Ctrl + c 终止进程
Ctrl + z 挂起进程(jobs 命令查看挂起的进程)
Ctrl + w 删除光标前一个单词(以空格符为分隔符)
Alt + d 删除光标后一个单词
Tab 自动补齐
变量:
概述:变量使用存储非固定值得载体,它具有一个值,以及零个或多个属性。
语法:name=[value]
注意:
如果value没有指定,变量将被赋值为空字符串,变量定义后使用$变量名称来调用变量的值。变量名规则:字母、数字下划线,首位不能为数字,变量值有特殊符号时需要用单引号括起来。
shell 变量分为3中:系统变量、环境变量、用户变量。
作用:系统变量在对参数判断和命令返回值时使用,而环境变量则主要是在程序运行时需要设置,用户变量又称为局部变量,多使用在shell脚本内部或者临时局部。
常见的系统变量:
$0 当前脚本名称
$n 当前脚本的第n个参数
$* 当前脚本的所有参数(不包括程序本身)
$# 当前脚本的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,返回0 表示成功
$$ 程序本身的PID号
常见的环境变量:
PATH 命令所示路径,以冒号未分割
HOME 打印用户家目录
SHELL 显示当前shell类型
USER 打印当前用户
ID 打印当前用户id信息
PWD 显示当前所在路径
TERM 打印当前终端类型
HOSTNAME 显示当前主机名
环境变量配置文件:
• /etc/profile 用户环境变量,交互,登录才执行
• /etc/bashrc 用户不用登录,执行shell就生效
• ~/.bashrc
• ~/.bash_profile
• ~/.bash_history
• ~/.bash_logout
特殊符号:
# 超级用户提示符 或 注释
$ 普通用户提示符
* 任意个任意字符
?任意一个字符
\ 脱义字符
| 管道符
•cut 分割,-d 分隔符 -f 指定段号 -c 指定第几个字符
• sort 排序, -n 以数字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
• wc -l 统计行数 -m 统计字符数 -w 统计词
• uniq 去重, -c统计行数
• tee 和>类似,重定向的同时还在屏幕显示
• tr 替换字符,tr 'a' 'b',大小写替换tr '[a-z]' '[A-Z]'
• split 切割,-b大小(默认单位字节),-l行数
与shell 相关的特殊符号:
• $ 变量前缀,!$组合,正则里面表示行尾
• ;多条命令写到一行,用分号分割
• ~ 用户家目录,后面正则表达式表示匹配符
• & 放到命令后面,会把命令丢到后台
• > >> 2> 2>> &>
• [ ] 指定字符中的一个,[0-9],[a-zA-Z],[abc]
|| 和 && ,用于命令之间