第9课笔记

shell介绍

shell脚本在日常的Linux系统管理中是必不可少的;
shell是系统跟计算机硬件交互时使用的中间介质。
shell是一个命令解释器,提供用户和机器之间的交互;
支持特定语法,比如逻辑判断、循环;
每个用户都可以由自己特定的shell;
centOS7默认shell为bash(Bourne Agin shell)
还有zhs、ksh等。

shell记录命令历史,默认保存至 .bash_history 文件中

概念:我们执行过的命令Linux都会记录,预设可以记录1000条命令历史,
这些命令保存在用户的家目录 .bash_history文件中。
# 只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至 .bash_history
  • 查看预设命令条数显示

    [root@localhost apache2]# echo $HISTSIZE
    1000 #默认1000条

  • 清空当前命令历史 history -c

    [root@localhost apache2]# history -c
    #不会删除存命令里面的东西

  • 预设值的配置文件,

    [root@localhost apache2]# vi /etc/profile
    46 HISTSIZE=1000 #46行在这里更改。

  • 需要重启后才生效,要么source一下就可以生效。

    [root@localhost apache2]# echo $HISTSIZE
    1000
    [root@localhost apache2]# soure /etc/profile
    -bash: soure: 未找到命令
    [root@localhost apache2]# source /etc/profile
    [root@localhost apache2]# !echo
    echo $HISTSIZE
    5000 #修改成功

  • 怎么样修改命令历史显示时间,修改变量

    [root@localhost /]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    [root@localhost /]# echo $HISTTIMEFORMAT #echo查看环境变量
    %Y/%m/%d %H:%M:%S
    [root@localhost /]# history #查看当前命令历史记录
    1 2018/04/17 21:00:15 vi /etc/profile
    2 2018/04/17 21:01:24 echo $HISTSIZE
    3 2018/04/17 21:01:56 soure /etc/profile
    4 2018/04/17 21:02:11 source /etc/profile
    5 2018/04/17 21:02:17 echo $HISTSIZE
    6 2018/04/17 21:07:20 cd /etc/yum.repos.d
    7 2018/04/17 21:07:22 ls
    8 2018/04/17 21:07:36 vi dvd.repo
    9 2018/04/17 21:09:35 cd ..
    10 2018/04/17 21:10:47 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    11 2018/04/17 21:11:18 echo HISTTIMEFORMAT
    12 2018/04/17 21:11:24 echo $HISTTIMEFORMAT
    13 2018/04/17 21:11:51 history

  • 想要永久生效,编辑配置文件/etc/profile,添加环境变量进去

    找到46行,在46行下添加环境变量 
    HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    2018.4.20 五周第三次课

  • 重启或者source一下。

    [root@localhost /]# source /etc/profile

  • 永久生效,chattr +a ~/.bash_history 添加权限只能追加,不能修改删除

    [root@localhost /]# chattr +a ~/.bash_history

  • !!:连续两个!表示执行上一条命令,示例如下:

    2018.4.20 五周第三次课

  • !n:这里的n是数字,表示执行命令历史中的第n条命令,例如 !17 表示执行命令历史的第17个命令,示例如下:

    2018.4.20 五周第三次课

  • !字符串:例如!w 表示执行命令历史中最近一次以 w 开头命令,示例如下:

    2018.4.20 五周第三次课

命令补全和别名

按tab键可以帮我们补全一个指令、一个路径或者一个文件名。
连续按两次tab键,系统则会把所有的命令或者文件都列出来。
  • 安装一个yum包,bash-completion,安装完后,需要重启一下才管用 reboot。

    [root@localhost ~]# systemctl res
    rescue reset-failed restart 
    [root@localhost ~]# systemctl restart

  • 别名alias,自定义别名

    [root@localhost ~]# alias restartnet='systemctl restart network.service'
    [root@localhost ~]# alias #查看别名是否设置成功,restartnet

  • alias目前系统预设的别名在:.bashrc 下

    2018.4.20 五周第三次课

    - 其他alias自定义别名,存放于 /etc/profile.d/下
    
    - 如何取消自定义别名:unalias restartnet

通配符

        在bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符

.
示例,查找所有以.txt结尾的文件

[root@localhost do]# ls *.txt
1.txt 2.txt 3.txt

  • [] 的通配使用

    [root@localhost do]# ls [23].txt
    2.txt 3.txt

输入输出重定向

概念:输入重定向用于改变命令的输入,输出重定向用于改变命令的输入。
输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。
输入重定向的命令是 <
输出重定向的命令是 >
还有错误重定向命令2>以及之u家重定向命令 >>
  • 输出重定向> ,把前面的命令追加到后面的文件里去,原内容删除,格式如下:

    [root@localhost do]# cat 1.txt 
    [root@localhost do]# echo "123123" >1.txt
    [root@localhost do]# cat 1.txt 
    123123
    [root@localhost do]# echo "123" >1.txt
    [root@localhost do]# cat 1.txt 
    123

  • 追加文字 >>,把前面的命令 追加到后面的文件去。

    [root@localhost do]# echo "123" >>1.txt
    [root@localhost do]# cat 1.txt 
    123
    123

  • 假如说运行一个错误的命令,如果报错的话 指向到一个文件里。 2>

    [root@localhost do]# lsaaaa 2> a.txt #在这里,如果没有报错的话,不会保存进去。
    [root@localhost do]# cat a.txt 
    -bash: lsaaaa: 未找到命令
    [root@localhost do]# ls 2> a.txt 
    1.txt 2.txt 3.txt a.txt

  • 2>追加重定向到某个文件里。

    [root@localhost do]# lsaaaa 2>> a.txt 
    [root@localhost do]# cat a.txt 
    -bash: lssad: 未找到命令
    -bash: lsaaaa: 未找到命令

  • 输入,左边必须是命令 ,不可以文件到文件 <
    [root@localhost do]# wc -l < 1.txt #正确用法
    2
    [root@localhost do]# 2.txt < 1.txt #错误用法
    -bash: 2.txt: 未找到命令

管道符、作业控制

管道符
  • 它用于将前一个指令的输出作为后一个指令的输入,例如:

    [root@localhost do]# cat 1.txt |wc -l #查看前面的文件有几行
    2

作业控制

  • CTRL+z 命令是暂停一个任务,
  • fg (foreground的简写)命令恢复
  • bg (background的简写)使它到后台运行
  • CTRL+c 终止

例如:使用vi命令编辑1.txt文件,随便输入一些内容,按ESC键,使用CTRL+z组合暂停任务,如下:

[root@localhost do]# vi 1.txt

[1]+ 已停止 vi 1.txt

  • 此时vi 1.txt已经停止,可以使用fg命令恢复它,此时右进入刚才vi窗口。

    [root@localhost do]# fg

  • jobs可以看见被暂停或者在后台运行的任务

    [root@localhost do]# jobs #先看下当下有没有被暂停或者在后台运行的
    [root@localhost do]# vi 1.txt 
    [1]+ 已停止 vi 1.txt
    [root@localhost do]# jobs 
    ?[1]+ 已停止 vi 1.txt

  • 如果想把暂停的任务放到后台重新运行,就使用bg
在后台运行的任务,得fg调至到前台后才可以终止解除CTRL+c

shell变量

概念:环境变量PATH,它是shell预设的一种变量,通常预设的变量都是大写的。
变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。
系统预设环境变量:
PATH、HOME、LOGNAME
  • 查看现在系统预设变量的值

    [root@localhost do]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

env 可以列出系统预设的全部系统变量

[root@localhost do]# env

set 不仅可以显示系统预设的变量,也可以显示用户自定义的变量

[root@localhost do]# set

自定义变量

规则:变量名规则可以是:字母 数字 下划线,首位不能为数字
变量值拥有特殊符号时需要用单引号括起来

[root@localhost /]# a=111 #自定义变量
[root@localhost /]# echo $a #查看变量0
111
[root@localhost /]# set |grep 111 #set 查看所有变量里的 111变量
_=111
a=111

特殊符号变量应用,假如带空格,单引号

[root@localhost /]# a='a b c'
[root@localhost /]# echo $a
a b cbr/>再或者加上特殊符号!(@*&#(*@!&#什么的。
[root@localhost /]# echo $a
a $bc

表示式复杂的时候,用双引号引起来,变量的累加

假设a=1 b=2 c=a"$b"c
我想echo出来的结果是 a2c, 那么就用双引号给变量推出来。
[root@localhost /]# a=1
[root@localhost /]# b=2
[root@localhost /]# c=a"$b"c
[root@localhost /]# echo $c
a2c

全局变量 export a=zhang1,向下一层生效,上一层不生效
取消变量,unset 后面跟名字,如取消a=zhang1

[root@localhost /]# unset a
[root@localhost /]# echo $a
#没有内容

环境变量配置文件

/etc/profile 用户环境变量,交互、登陆才执行(不要修改)
概念:/etc/profile这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、等变量。
/etc/bashrc 用户不用登陆,执行shell就生效。(不要修改)
这个文件主要预设umask以及PS1; 这个PS1就是我们在输入命令时前面的那串字符; 例如Linux系统的就是[root@localhost ~]# 我们可以看一下PS1的值,如下: [root@localhost /]# echo $PS1 [\u@\h \W]\$ 其中,\u指用户,\h指主机名,\W指当前目录,\$指字符# (如果是普通用户则为¥)
~/.bashrc
概念:该文件包含专属于自己的shell的bash信息; 当登陆或每次新打开新的shell时,该文件会被读取; 例如,你可以将用户自定义的别名或者自定义变量写到这个文件中。
~/.bash_profile
概念:该文件定义了用户的个人化路径于环境变量的文件名称; 每个用户都可使用该文件输入专属自己的shell信息,当用户登陆时,该文件仅执行一次。
~/.bash_history
概念:该文件用户记录命令历史。
~/.bash_logout
概念:当退出shell时,会执行该文件,可以将一些清理的工作放到这个文件中。
更改用户自定义颜色:

[root@localhost /]# PS1='[\033[01;32m]\u@\h[\033[00m]:[\033[01;36m]\w[\033[00m]\$ '

shell特殊符号_cut命令

概念:cut命令用来截取某一个字段
格式:cut -d '分割字符' [-cf] n,这里的n是数字,该命令选项有如下几个:
- d 后面跟分割字符,分割字符要用单引号括起来
- c 后面接的是第几个字符
- f 后面接的是第几个区块
cut命令用法如下

[root@localhost do]# cat /etc/passwd |head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost do]# cat /etc/passwd |head -2 |cut -d ':' -f 1
root
bin
[root@localhost do]# cat /etc/passwd |head -2 |cut -d ':' -f 1,2
root:x
bin:x
[root@localhost do]# cat /etc/passwd |head -2 |cut -d ':' -f 1-3
root:x:0
bin:x:1

cat passwd这个文件,head只查看前两行,cut -d截取分割符号为“:”, -f 1 表示截取第一段,1,2表示前两段,1-3表示头三段。

sort排序_wc统计行数_uniq删除重复行

sort命令介绍

sort命令用于排序
格式:sort [-t 分隔符] [-kn1,n2] [-nru]
这里-n1和n2指的是数字,其他选项如下:
-t 后面跟分割字符,作用跟cut -d选项一样,截取符号是什么;
-n 表示使用纯数字排序,字母及特殊符号表示为0;
-r 表示反向排序;
-u 表示除去重复;
-kn1,n2 表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。
  • 例:如sort不加任何选项,他是默认升序输出,我们假设看passwd配置文件前五行有什么区别。

    [root@localhost /]# head -n5 /etc/passwd |sort 
    #查看passwd前五行,输出给sort(排序)执行,按默认升序排序。
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash

例2:把passwd配置文件前10行写到3.txt,再加几个特殊符号数字进行排序。

2018.4.24 五周第五次课(shell特殊符号,cut截取等命令)
如图所示,我们用sort来进行排序,以数字排序 -n
[root@localhost do]# sort -n 3.txt #-n表示正序,特殊符号及字母表示为0
2018.4.24 五周第五次课(shell特殊符号,cut截取等命令)
如第一张图所示,我们-r 给反向排序看看
[root@localhost do]# sort -r 3.txt #-r表示反序
2018.4.24 五周第五次课(shell特殊符号,cut截取等命令)

wc 命令介绍,用于来统计

概念:wc命令用于统计文档的行数,字符数或词数。
选项:
-l 统计行数
-m 统计字符数
-w 统计词数,以空格作为区分
  • 具体操作如下:

    [root@localhost do]# wc /etc/passwd #查看这个文档的行数,词数及字数
    19 27 846 /etc/passwd
    [root@localhost do]# wc -l /etc/passwd #统计行数
    19 /etc/passwd
    [root@localhost do]# wc -m /etc/passwd #统计字数
    846 /etc/passwd
    [root@localhost do]# wc -w /etc/passwd #统计行数
    27 /etc/passwd

命令uniq 删除重复的行

概念:uniq命令用来删除重复的行,改名了只有-c选项比较常用;
它表示统计重复的行数,并把行数写在前面。
  • 编写一个文件,示例如下:

    [root@localhost do]# touch 4.txt #创建一个文本
    [root@localhost do]# vi 4.txt #编辑内容
    111
    222
    333
    111

  • 使用uniq前,必须献给文件排序,否则不管用,示例如下:

    [root@localhost do]# cat 4.txt #查看里面的内容
    111
    222
    333
    111
    [root@localhost do]# uniq 4.txt #测试一下看看不排序管用么,不管用的
    111
    222
    333
    111
    [root@localhost do]# sort 4.txt |uniq #sort排序4.txt文件,再输出给uniq删除重复行
    111
    222
    333
    [root@localhost do]# sort 4.txt |uniq -c #统计重复的有行,有多少
    2 111
    1 222
    1 333

命令tee,重定向并显示内容

tee命令后面跟文件名,起作用类似于重定向>,但它比重定向多一个功能;
把echo输出的结果,通过管道符“|” tee输出给后面的文件并在屏幕上显示。
  • 具体操作如下:

    [root@localhost do]# touch 1.txt #创建一个文本
    [root@localhost do]# echo "1321asd123" | tee 1.txt #把echo的内容通过管道符号,输出给 tee命令,到1.txt文件,并且在屏幕显示结果。
    1321asd123

命令tr,用于替换字符

tr命令用于替换字符,常用来处理文档中出现的特殊符号;
如DOS文档中出现的符号^M,该命令常用的选项如下:
-d 表示删除某个字符,后面跟要删除的字符;
-s 表示删除重复的字符。
  • 假设把一个文件的小l,改成大L

    [root@localhost do]# echo "linux" > 1.txt 
    [root@localhost do]# cat 1.txt 
    linux
    [root@localhost do]# echo "linux" | tr '[l]' '[L]' #把前面的小l,改成L
    Linux

命令split,切割文档

split命令用于切割文档,常用的选项为-b和-l
-b 表示依据大小来分割文档,默认单位为byte(字节)
-l 表示依据行数来分割文档
  • 先搜索出来个内容,并且所有的内容cat出来,追加重定向到一个文件去

    [root@localhost /]# find /etc/ -type f -name "*conf" -exec cat {} >> /tmp/do/1.txt \;
    #find 搜索 /etc/ 下的文件 名字问conf结尾的文件,cat {}查看出来的内容,追加到1.txt文件中。
    [root@localhost /]# du -sh /tmp/do/1.txt #查看这个文件的大小
    212K /tmp/do/1.txt

  • 示例1:这个文件有212K,我们给他切割指定大小为100K试试,示例如下:

    2018.4.24 五周第五次课(shell特殊符号,cut截取等命令)
    #这里,-b 指定带下100K,不加单位默认是以字节显示。

  • 示例2:指定目标文件名123开头的文件。

    2018.4.24 五周第五次课(shell特殊符号,cut截取等命令)
    #x开头的文件,是示例1的结果,不需要看他,看123开头的文件,形成一个对比。

shell特殊符号

重点章节,以后会经常用到
特殊符号 $
  • 符号$可以用作变量前面的标识符,还可以和!结合起来使用,示例如下:

[root@localhost do]# 
[root@localhost do]# ls /tmp/do/
123aa 1.txt 2.txt 3.txt 4.txt a.txt xaa xab xac
[root@localhost do]# !ls
ls /tmp/do/
123aa 1.txt 2.txt 3.txt 4.txt a.txt xaa xab xac
!$表示上条命令中的最后一个参数。

特殊符号 ;
  • 如果想在一行中运行两个或两个以上的命令,需要在命令之间加符号;示例如下:

    [root@localhost dior1]# mkdir 123 ; touch 1.txt ; touch 2.txt ; ls
    123 1.txt 2.txt
    如上含义,创建了个目录,又创建了2个文件,并且最后ls查看执行

特殊符号 ~
  • 符号~ 表示用户的家目录,root用户的家目录是/root,普通用户是/home/username
特殊符号 &
  • 如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况,可以用在sleep(休眠),示例如下:

    [root@localhost ~]# sleep 30 & 
    [1] 40966
    [root@localhost ~]# jobs 
    [1]+ 运行中 sleep 30 &

重定向符号> 、>> 、2> 、 2>> 、 &> 的用法
概念:>、>>他们分别代表取代(>)和追加(>>)的意思;
当我们运行一个命令报错时,报错信息会输出到当前屏幕;
如果想重定向到一个文本,则需要用重定向符号2>或2>>;
他们分别表示错误重定向和错误追加重定向。
&>表示错误和正确的重定向输入到一个文件里去
中括号[]
  • 中括号内为字符组合,代表字符组合中的任意一个。指定一个范围。(上一章节有提到)
特殊符号 &&和||
  • 使用||时,表示或者,意思是说 如果两条命令用||分割的话,第一条执行成功后,第二条就不会执行,假如第一条命令是错误的话,执行失败就会执行第二条。

    示例1,假设两个命令都是正确的
    [root@localhost do]# ls 1.txt || wc -l 2.txt 
    1.txt

示例2: 假设第一条命令是错误的,而第二条命令是正确的,就会执行第二条
[root@localhost do]# ls 111111.txt || wc -l 2.txt #在这里 根本就没有一串1的txt文件
ls: 无法访问111111.txt: 没有那个文件或目录
0 2.txt

  • 使用&& 表示前面的命令执行成功以后,才会执行后面的命令,如果前面命令执行不成功,后面的命令就不会执行。用&&分割,用来判断的。

    示例1,两条命令都是正确的情况下 
    [root@localhost do]# ls 1.txt && wc -l 2.txt #ok,在这里两条命令都生效
    1.txt
    0 2.txt

示例2,假如第一条命令不成功,后面的命令就不会执行。
[root@localhost do]# ls 111.txt && wc -l 2.txt 
ls: 无法访问111.txt: 没有那个文件或目录

普通特殊符号介绍

 * 任意个任意字符
 ? 任意一个字符
 #注释字符
 \ 脱义字符
 | 管道符

 

转载于:https://my.oschina.net/u/3851573/blog/1823499

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值