• 随堂练习 bash shell特性和I/O重定向及管道


    history  命令语法格式

    history [-e] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]

    选项      说明

    -c      表示清空历史命令

    -d,offset  删除历史中指定的第offset 个命令

    n       显示最近的 n 条历史

    -a      追加本次会话新执行的命令历史列表至历史文件

    -r      读历史文件附加到历史列表

    -w         保存历史列表到指定的历史文件

    -n      读取历史文件中未读过的行到历史列表

    -p      展开历史参数成多行,但不存在历史列表中

    -s      展开历史参数成一行,附加在历史列表后

    控制历史列表的变量如下:

    变量           说明

    HISTSIZE       命令历史记录的条数

    HISTFILE      指定历史文件,默认为~/.bash_history

    HISTFLIESIZE     命令历史文件记录历史的条数

    HISTTMEFORMAT  显示时间,示例:HISTTMEFORMAT=“%F  %T”

    HISTIGNORE     指定在历史中不记录的命令,示例:HISTIGNORE=“str1:str2*...”,忽略str1 命令,str2 开头的历史

    HISTCONTROL    控制命令历史的记录方式,可设置的值如下:

                ignoredups:默认,忽略重复的命令,连续且相同认为重复

                ignorespace:忽略所有以空白开头的命令

                ignoreboth:相当于 ignoredups 和 ignorespace 的组合

                erasedups:删除重复命令

    命令历史的快捷方式使用

      重复前一个命令有三种方法:

        1)使用向上的方向键并回车执行

        2)按!! 回车执行

        3)输入 !-1 并回车执行

    执行前一个不包含参数的命令: !:0

    执行history 命令输出对应序号 n 的命令:!n

    执行history 历史中倒数第n 个命令: !-n

    重复前一个以string 开头的命令:!string

    重复前一个包含string 的命令:!?string

    仅打印命令历史,并不执行:!string:p

    打印输出 !$ (上一个命令的最后一参数)的内容: !$:p

    打印输出 !* (上一个命令的所有参数)的内容:!*:p

    删除上一个命令中的第一个string : ^string

    将上一个命令的第一个string1 替换为 string2 :^string1^string2

    将上一个命令中所有的string1 都替换为 string2:!:gs/string1/string2

    使用up(向上)和down(向下)键来上下浏览从前输入的命令

    在命令历史中搜索命令: Ctrl + r

    从历史搜索模式退出:Ctrl + g

    要重新调用前一个命令最后一个参数,三种方式

      1)!$

      2)Esc,.(单击Esc键后松开,再单击. 键)

      3)Alt + .(按住Alt键同时单击. 键)

    通配符 glob

               匹配任意长度的任意字符,如:p* 可匹配p 开头的所有文件

    ?            匹配任意单个字符,如:p? 可匹配p 后面出现的单个字符的文件;如 pa

    []           中括号匹配指定集合内的任意单个字符

    [long]        表示 l,o,n,g 四个字符的任意一个

    [0-9]          匹配单个数字

    [[:upper:]]     匹配任意单个所有大写字母

    [[:lower:]]     匹配任意单个所有小写字母

    [[:digit:]]     匹配任意单个所有数字,等价于[0-9]

    [[:alpha:]]     匹配任意单个所有字母

    [[:alnum:]]    匹配任意单个所有字母和数字

    [[:space:]]     匹配单个空白字符

    [[:punctl:]]     匹配单个标点符号

    [^]         匹配指定集合外的任意单个字符

    变量赋值和引用

    赋值格式:

    变量名=变量对应的值

    name=long

    注意:等号两边不能有空格符

    变量引用格式:

    当想引用变量时,需要在变量前加 $

    比如:echo $name

    删除变量:unset 变量名

    变量使用规则如下:

    1)变量名只能包含英文字母,数字及下划线,但不能以数字开头

    2)不要使用shell 中的命令和关键字作为变量,如 :if  ,do等

    3)变量内容如有空格,可使用双引号或者单引号括起来

    4)转义符()的使用,将一些特殊符号显示为字面本身的符号,如Enter 键,$,,空格符,单引号(‘)等变成一般符号

    5)如果变量没有赋值直接引用,其值为空,即为null

    6)变量引用时,若变量名和其他字符相连时,需要用${变量名}

    变量的分类

    1)普通变量作用域为当前shell 进程,不包括其子进程,注意所有的普通变量在shell 进程终止时,会被自动销毁

    2)环境变量作用域为当前shell 进程及其子进程,需要使用关键字 export 或 declare -x 来声明,才可以成为环境变量

    3)本地变量作用域即可引用到的范围,比如函数,需要使用关键字local 来声明才能成为本地变量

    声明变量为环境变量格式:

    export 变量名

    声明本地变量格式

    local 变量名

    显示所有环境变量相关的命令:exportdeclare -xenv

    显示所有变量和函数:set

    声明只读变量格式:

    readonly 变量名

    显示所有只读变量相关命令:readonlydeclare -r

    常见的系统内置变量

    UID           当前用户的UID

    HOME        代表当前用户的家目录,可使用cd ~ 或cd 命令也可切换到用户家目录

    SHELL       当前使用shell 类型

    BASHPID       当前BASH 的进程编号即 PID

    HISTSIZE      记录命令历史的数目

    MALL        当前用户的邮件信箱文件存储目录

    PATH         执行文件的搜索路径,目录之间以冒号分隔,搜索是按路径是顺序目录来查询的,所以目录的顺序也很重要

    LANG        系统使用的语言及编码字符集,很多数据都会用到它,可以用 locale -a 命令,查看系统支持的所有语系编码;要设置永久生效CentOS7需要修改 /etc/locale.conf 文件,(CentOS6 是修改 /etc/sysconfig/il8n 文件)例如:LANG="en_US.UTF-8" ,也可以通过localectl 命令进行管理

    RANDOM    生成随机数字的变量,该变量取值的范围 0-32767 之间

    PS1        命令提示符

    OSTYPE      操作系统类型,如:执行命令 echo $OSTYPE,显示结果为 linux-gnu

    HOSTTYPE    主机类型,如:执行命令echo $HOSTTYPE,显示结果为 x86_64

    MACHTYPE     机器类型,如:执行命令echo $MACHTYPE,显示结果为 x86_64-redhat-linux-gnu

    执行 echo $? 可以查看到结果值

    0是上一条命令执行成功返回的值

    非0是上一条命令执行失败返回的值(1-255)

    单引号,双引号,反向单引号

    1)当变量内容用单引号时,对里面的命令 echo 和变量 USER 都无法识别,只识别成字符串本身,称之为强引用     (最傻)

    2)当变量内容用双引号时,是不能识别出里面的命令echo 的,但可以识别出里面的变量USER ,称之为弱引用    (两者之间)

    3)当变量内容用反向单引号时,对里面的命令 echo 和变量 USER 都可以识别,并执行里面的命令echo 。反向单引号和 $()功能一样   (聪明)

    分号连接多命令

    格式:command1 ; command2 ; ... ; commandN

    小括号包含多个命令

    格式:(command1 ; command2 ; ... ; commandN)

    花括号包含多个命令

    格式:{ command1 ; command2 ; ... ; commandN; }

    I/O 重定向和管道

    1)标准输入的重定向:描述符代码为 0 ;使用 0<  或  < 实现标准输入的重定向。其中 0 可以省略

    2)标准输出的重定向:描述符代码为 1 ;使用 1> 或 > 实现标准输出的重定向。其中 1 可以省略

    3)标准错误的重定向:描述符代码为 2;使用 2> 或者 2>> 实现标准错误的重定向。

    所有标准输出和错误的重定向

    实现方式有两种:

    1) &> file

    2)> file 2>&1

    管道

    使用格式:

    command1 | command2 | command3...

    1)上述格式实现了将 command1 命令的标准输出进行重定向,传给 command2,并做为 command2 的标准输入,实现 command2 的输入重定向,同样还可以继续将 command2 的标准输出,作为 command3 的标准输入,以此类推下去

    2)需要注意的是,管道符只能处理前一个命令 command1 的标准输出, 而非标准错误。如果想要让 command2 来接收 command1 的标准错误,可以使用下面的两种格式

      command1 2>&1 | command2

      command1 | & command2

    生产案例:

    创建一个日志文件,文件名的格式为:test-昨天日期.log,其中:日期格式为:YYYY-MM-DD

    答:

    [root@localhost ~]# date
    Wed Jul 1 11:38:55 CST 2020

    [root@localhost ~]# touch test-`date -d "-1 day" +%F`.log

    -rw-r--r-- 1 root root 0 Jul 1 11:39 test-2020-06-30.log

    面试题

    1)如何保存linux 历史命令并显示命令操作是时间?

    答:设置环境变量,临时生效

    [root@localhost ~]# HISTTIMEFORMAT="%F %T"

    永久生效,要把 HISTTIMEFORMAT="%F %T" 指令写到配置文件中 /etc/profile (全局所有用户有效)或 ~/.bash_profile (当前用户有效)

    2)特殊变量中 $$ 表示什么?

    答:表示当前进程的pid 号码

    3)将程序的输出重定向到file1 和错误信息重定向到 file2 的命令是?

    答:program > file1 2> file2

    4)找出IO 重定向执行结果与其他三个不同的:

    A  ./app.sh > app.log 2>&1

    B  ./app.sh 2>&1 app.log

    C  ./app.sh &> app.log

    D  ./app.sh 2> app.log >&2

    答:B

  • 相关阅读:
    XDOJ1156: 等待队列
    XDOJ 1009: Josephus环的复仇
    cookie浏览器编写测试无效???
    express框架中cookie的使用
    JS设置Cookie过期时间
    CSS 伪元素
    art-template手动编写时间过滤器
    mongoose设置默认值、模块化及性能测试
    Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify
    mongoose 联表查询之populate使用及注意事项
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/13218444.html
Copyright © 2020-2023  润新知