热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

history 命令语法格式history[-e][-doffset][n]orhistory-anrw[filename]orhistory-psarg[arg]选项说明-

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 变量名

显示所有环境变量相关的命令:export,declare -x,env

显示所有变量和函数:set

声明只读变量格式:

readonly 变量名

显示所有只读变量相关命令:readonly 或 declare -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



推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
author-avatar
用户q4oaa53j5h
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有