您的位置:首页 > 运维架构 > Shell

[8] Shell 基础知识

2017-07-01 00:27 176 查看

[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


扩展

shell 1>&2 2>&1 &>filename重定向的含义和区别

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: