[8] Shell 基础知识
8.1 shell介绍
提供使用者使用界面”的软件(命令解析器,提供用户和机器之间的交互,支持特定语法,比如逻辑判断、循环,centos7默认shell为bash(Bourne Again Shell)。除了bash之外还有zsh、ksh
8.2 命令历史
- 命令历史文件
[root@localhost ~]# ls .bash_history
- 历史命令最大保存1000条
[root@localhost ~]# echo $HISTSIZE
1000
- 清空命令历史
[root@localhost ~]# history -c
清空内存中命令历史,但不会清空命令历史文件.bash_history
前输入的命令历史,不会立刻保存到命令历史文件中,而是先保存在内存中,只有退出当前终端时才会将内存命令历史写到文件中
- 更改最大命令历史
[root@localhost ~]# vim /etc/profile
搜索HISTSIZE关键字,更改值为5000
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $HISTSIZE
5000
- 添加命令历史修改时间
新建一个环境变量,用来输出时间格式
[root@localhost ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
[root@localhost ~]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S
[root@localhost ~]# history
1 2017/06/29 00:49:11 vim /etc/profile
2 2017/06/29 00:49:21 [root@localhost ~]# vim /etc/profile
3 2017/06/29 00:50:26 vim /etc/profile
4 2017/06/29 00:51:05 source /etc/profile
5 2017/06/29 00:51:16 echo $HISTSIZE
6 2017/06/29 00:51:21 [root@localhost ~]# source /etc/profile
7 2017/06/29 00:51:21 [root@localhost ~]# echo $HISTSIZE
8 2017/06/29 00:54:52 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
9 2017/06/29 00:55:06 echo $HISTTIMEFORMAT
10 2017/06/29 00:55:21 history
上述方法只在上前终端有效,下面方法可全局生效
将$HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "写进/etc/profie中,并生效该文件
- 设置命令历史文件特殊权限,防止被删除
[root@localhost ~]# chattr +a .bash_history
此时不设置最大保存命令数量,该文件也不会被删除
- 其他历史用法
!! 表运行history文件中最后一条命令
!n n为historyr命令显示内容的序列号,如!24,运行history命令历史中第24条命令
!word 运行history命令中最近的关键词的命令
8.3 命令补全和别名
tab补全命令、文件路径
centos7中支持参数补全,操作如下:
[root@localhost ~]# yum install -y bash-completion
设置别名:alias 别名='具体命令'
取消别名:unalis 别名
8.4 通配符
* 通配零个或无穷多任意字符
? 通配一个任意字符
+ 通配一个或多个任意字符
[0-9] 或 [a-z] 范围内,任选其一,或者
{1,2} 范围内,人员其一,或1,或2
8.5 输入输出重定向
- 输出
echo "123" > 1.txt 将123输入到1.txt文件中,会覆盖原1.txt数据
echo "123" >> 1.txt 将123追加到1.txt文件中,不会覆盖原1.txt数据
2> 错误重定向,将屏幕中错误信息重定向至文件中
2>> 追加错误重定向,将屏幕中错误信息追加重定向至文件中
>+2> == &> 将错误和正确的信息重定向到文件中
>+2>> == &>> 将错误和正确的信息追加重定向到文件中
- 将正确和错误输出区分开
[root@localhost ~]# ls [1-9].txt 222.txt > 1.txt 2> 2.txt
- 输入
用法:[命令]<文件,将后面的文件作为前面命令的参数输入
[root@localhost ~]# wc -l < 2.txt
2
8.6 管道符和作业控制
- | 管道符
将一个命令的输出变为另一个命令的输入
[root@localhost ~]# ls | wc -l
25
[root@localhost ~]# find / -name "*.conf" |wc -l
721
[root@localhost ~]# yum list |grep vim
- 作业控制
ctrl+z 暂停一个命令
jobs 查看当前终端后台运行或者暂停的任务,但可以查看到该任务进程
fg+n 恢复暂停的任务,放置前台运行,n为jobs命令查询到的id号
bg+n 把任务放到后台运行,n为jobs命令查询到的id号
[root@localhost ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1298764 1112 387736 0 0 108 19 54 74 0 0 98 2 0
0 0 0 1298748 1112 387736 0 0 0 0 39 46 0 0 100 0 0
^Z
[1]+ 已停止 vmstat 1
[root@localhost ~]# bg
[root@localhost ~]# jobs
[1]+ 运行中 vmstat 1 &
还有一种办法可以将任务快速丢到后台运行
[root@localhost ~]# sleep 100 &
[1] 2561
[root@localhost ~]# jobs
[1]+ 运行中 sleep 100 &
ps aux 查看系统进程
kill -9 [pid] 结束进程
8.7 shell变量
- env 查看系统预设全部环境变量
- set 查看系统预设的全部变量、用户自定义的变量
- 变量名规则
myname=temence
1.设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格;
2.变量名只能由英、数字以及下划线组成,而且不能以数字开头;
3.当变量内容带有特殊字符(如空格)时,需要加上单引号。
4.变量内容中本身带有单引号,这就需要用到双引号了。 myname="temence's"
5.变量内容中需要用到其他命令运行结果,使用反引号。 myname=`pwd`
6.变量内容可以累加其他变量的内容,需要加双引号 myname="$LOGNAME"temence
总结:使用双引号时不会取消掉里面出现的特殊字符的本身作用(比如$),而使用单引号则里面的特殊字符全部失去它本身的作用。
- 查看当前终端
[root@localhost ~]# echo $SSH_TTY
/dev/pts/1
[root@localhost ~]# w
01:46:21 up 1:35, 1 user, load average: 0.07, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.1.33 00:40 5.00s 0.38s 0.00s w
- 进入当前shell子shell
[root@localhost ~]# bash 进入子shell
[root@localhost ~]# pstree 显示树状结构,清楚地表达程序间的相互关系
[root@localhost ~]# exit 退出子shell
- 全局变量
默认当前新建的变量都只会在当前终端下生效,本地变量并非全局变量,很多时候需要将变量生效为全局变量。需要使用export,export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量。如果export后面不加任何变量名,则它会声明所有的变量。export向下声明变量,不能向上声明变量
用法:export [变量名]
[root@localhost ~]# ggg=temence 设置ggg变量
[root@localhost ~]# echo $ggg 显示变量ggg内容
temence
[root@localhost ~]# bash 进入子shell
[root@localhost ~]# echo $ggg 查看子shell中ggg变量值
[root@localhost ~]# exit
exit
[root@localhost ~]# export ggg 全局申明变量ggg
[root@localhost ~]# bash 再次进入子shell
[root@localhost ~]# echo $ggg 再次查看子shell中ggg变量值,此时可以看到全局变量ggg的值
temence
- 取消变量
用法:unset [变量名]
8.8 环境变量配置文件
/etc/profile 用户环境变量,交换、登陆后才能执行里面内容。预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL, INPUTRC,HOSTNAME,HISTSIZE,umask等等。
/etc/bashrc 用户不用登陆,执行shell就能生效。预设umask值以及PS1(echo $PS1)。
.bash_profile 定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
.bashrc 该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
.bash_history 记录命令历史。
.bash_logout 当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
- PS1 环境变量
PS1是主提示符变量,也是默认提示符变量。定义命令行提示字符即可,最常用的需求就是显示登录的用户名、主目录、主机名
显示用户名,主机名和动态显示当前目录
[\u@\h \W]\$
颜色显示用户名、主机名、当前目录
[root@localhost etc]# PS1='[\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;36m\]\W\[\033[00m\]]\$ '
PS1常用参数如下:
/d 代表日期,格式为weekday month date,例如:"Mon Aug 1"
/H 完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
/h 仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
/t 显示时间为24小时格式,如:HH:MM:SS
/T 显示时间为12小时格式
/A 显示时间为24小时格式:HH:MM
/u 当前用户的账号名称
/v BASH的版本信息
/w 完整的工作目录名称。家目录会以 ~代替
/W 利用basename取得工作目录名称,所以只会列出最后一个目录
/# 下达的第几个命令
/$ 提示字符,如果是root时,提示符为:# ,普通用户则为:$
/[ 字符"["
/] 字符"]"
/! 命令行动态统计历史命令次数
- PS2 环境变量
PS2是副提示符变量,默认值是 > ,一般使用于命令行里较长命令的换行提示信息。如进入mysql提示信息
8.9 cut命令
- shell特殊符号
* 代表任意个字符
? 代表任意一个字符
# 注释字符
\ 脱意字符
| 管道符
$ 变量前缀
!$ 在一行中运行两个或两个以上的命令,在命令之间加一个;
; shell命令行中表示上一条命令,正则里面表示行尾
~ 用户家目录,正则表达式中表示匹配符
& 放到命令后面,把命令丢到后台
> 输出重定向
>> 追加重定向
< 输入重定向
2> 错误重定向
2>> 错误追加重定向
[ ] 中间为字符组合,代表中间字符中的任意一个; 也可以,if判断语句[ -d dir ]判断目录是否存在
shell中的连接符
(1) command1 ; command2 和 不管command1是否执行成功都会执行command2
(2) command1 && command2 并且 只有command1执行成功后,command2才会执行
(3) command1 || command2 或 command1和command2中只会执行一条命令。1执行,2不执行,2执行,1不执行。
- cut 命令
语法: cut -d "分隔字符" [-cf] n 这里的n是正整数
-d 指定分隔符,不用引号也可以
-f 指定第几段
-c 后面只有一个数字表示截取第几个字符,后面跟一个数字区域n1-n10,表示截取从几到几,也可以n1,n3,n5 ,表示截取第一,三,五字符。-c参数不能和-d参数同时使用
[root@localhost /]# cat /etc/passwd |head -n2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost /]# cat /etc/passwd |head -n2 | cut -d ":" -f 1-4
root:x:0:0
bin:x:1:1
[root@localhost /]# cat /etc/passwd |head -n2 | cut -c 1-10
root:x:0:0
bin:x:1:1:
8.10 sort\wc\uniq命令
- sort 排序
语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1<n2
-t : 指定分隔符,作用跟cut的-d一个意思
-n:使用纯数字排序,字幕和特殊符号被识别为0
-r:反向排序
-u:去重复 当使用-un参数时,sort会把文档中的字母看成0。
-kn1,n2:由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序不加任何参数,则按照ASCII码升序排序
- uniq 去重复命令
比sort -u多一个功能,可以计算重复的行数
使用uniq 的前提是需要先给文件排序
-c:统计重复的行数,并把行数写在前面
sort testb.txt |uniq -c
- wc命令
-l 统计行数,后面可以跟多个文件,算总行数
-w 统计单词个数,以空格为分隔符
-m 统计字符个数
8.11 tee\tr\split命令
- tee 双重输出
类似与重定向,但是比重定向多了一个功能,在把文件写入后面所跟的文件,还显示在屏幕上。常用于管道符|后
-a 可以在文件中追加内容
[root@localhost ~]# echo "aa" |tee test.txt
aa
[root@localhost ~]# cat test.txt
aa
[root@localhost ~]# echo "bb" > test.txt
[root@localhost ~]# cat test.txt
bb
清空一个文件内容,而不删除文件
[root@localhost ~]# > test.txt
[root@localhost ~]# cat test.txt
- tr 替换字符
-d:删除某个字符,-d后面跟要删除的字符
-s:把重复的字符去掉,后面再跟一个字符把重复的字符替换成后面跟的字符
替换大小写 tr '[a-z]' '[A-Z]'
[root@localhost ~]# echo "temence" |tr "temence" "Temence"
Temence
- split 切割文件
-b:依据大小来分割文档,默认单位为byte
-l:依据行数来分割文档
文件后面可以指定切割后的文件名 split -b500 passwd 123