[8] Shell 基础知识

来源:互联网 发布:苹果电脑装机软件 编辑:程序博客网 时间:2024/06/06 17:16

[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 $HISTSIZE5000
  • 添加命令历史修改时间
    新建一个环境变量,用来输出时间格式
[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                          nhistoryr命令显示内容的序列号,如!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.txt123输入到1.txt文件中,会覆盖原1.txt数据echo "123" >> 1.txt123追加到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 -l25[root@localhost ~]# find / -name "*.conf" |wc -l721[root@localhost ~]# yum list |grep vim 
  • 作业控制
ctrl+z              暂停一个命令jobs                查看当前终端后台运行或者暂停的任务,但可以查看到该任务进程fg+n                恢复暂停的任务,放置前台运行,n为jobs命令查询到的id号bg+n                把任务放到后台运行,n为jobs命令查询到的id号[root@localhost ~]# vmstat  1procs -----------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=temence1.设定变量的格式为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.05USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATroot     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 ~]# exitexit[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 -n2root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin[root@localhost /]# cat /etc/passwd |head -n2 | cut -d ":" -f 1-4root:x:0:0bin:x:1:1[root@localhost /]# cat /etc/passwd |head -n2 | cut -c 1-10root:x:0:0bin: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.txtaa[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
原创粉丝点击