随堂练习 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 变量名

显示所有环境变量相关的命令: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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...