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