随堂练习bashshell特性和i/o重定向及管道

空白的Melody 空白的Melody     2022-12-26     406

关键词:

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

管道及i/o重定向

管道及IO重定向><>><<计算机组成:运算器,控制器:CPU存储器:RAM输入/输出设备I/O程序:指令和数据控制器:指令运算器:存储器:地址总线:内存寻址数据总线:传输数据控制总线:控制指令寄存器:CPU暂时存储... 查看详情

i/o重定向及管道(代码片段)

...eyborad,0标准输出:monitor,1标准错误输出:monitor,2I/O重定向:改变标准位置输出重定向:COMMAND>NEW_POS,COMMAND>>NEW_POS:覆盖重定向,目标文件中的原有文件内容会被清除>:追加重定向,新内容会追加至目标文件尾部set-... 查看详情

标准i/o重定向和管道(代码片段)

一级标题标准I/o重定向和管道二级标题三种I/o设备1.标准输入和输出程序:指令+数据读入数据input输出数据output标准输入---0(默认接收来自终端窗口的输入)标准输出---1(默认输出到终端窗口)标准错误---2(默认输出到终端窗口)二级... 查看详情

标准i/o与管道;用户组和权限;文件处理工具及正则表达式总结

...终端窗口?标准错误(STDERR)-2默认输出到终端窗口?I/O重定向:改变默认位置把输出和错误重新定向到文件?STDOUT和STDERR可以被重定向到文件命令操作符号文件名支持的操作符号包括:把STDOUT重定向到文件2>把STDERR重定向到文件... 查看详情

linuxi/o重定向及管道(代码片段)

一,I/O重定向重定向正常输出>:覆盖以存在文件的内容,很危险的操作>>:如果文件已经存在,则是在原内容的最后追加。可以禁止>的覆盖行为,使用set-C。只在当前会话有效。set+C恢复覆盖行为。#set-C#cat/etc/issue>/tmp... 查看详情

管道及io重定向

管道和IO重定向:>< >> <<运算器、控制器:CPU存储器:RAM输入设备/输出设备程序:指令和数据控制器:指令运算器:存储器地址总线:内存寻址数据总线:传输数据控制总线:控制指令寄存器:CPU暂时存储器... 查看详情

标准io重定向和管道(代码片段)

标准I/O重定向和管道1标准输入和输出程序:指令+数据读入数据:Input输出数据:Output打开的文件都有一个fd:filedescriptor(文件描述符)Linux给程序提供三种I/O设备标准输入(STDIN)-0默认接受来自终端窗口的输入标准输出(STDOUT)-1... 查看详情

标准i/o和管道(代码片段)

标准I/O和管道>重定向操作符>,>>还能创建新文件>覆盖>>追加set-C禁止将内容覆盖已有文件,但可追加(相当于一个开关)>|file强制覆盖set+C允许覆盖1>标准输出重定向到一个文件里面2>标准错误重定向到一个文... 查看详情

linux基础知识-i/o重定向,管道

...R,2 标准输入:键盘标准输出和错误输出:显示器I/O重定向:Linux:>:覆盖输出[[email protected]~]#ll/var/>/tmp/var.out[[email protected]~]#c 查看详情

第五章linux重定向和管道

重定向和管道标准输入和输出:程序:指令+数据读入数据:Input输出数据:Output打开的文件都有一个fd:filedescriptor(文件描述符)Linux给程序提供三种I/O设备标准输入(STDIN)-0默认接受来自键盘的输入标准输出(STDOUT)-1默认输... 查看详情

标准i/o和管道

...  标准错误(STDERR)-2默认输出到终端窗口3>把I/O重定向至文件  I/O重定向:改变默认位置  查看详情

06i/o重定向与管道符

   首先,我们知道我们的计算机结构,在第一节的时候已经介绍过了,CPU进行数据运算,同时控制器负责指令的发送,而内存则是数据存储的地方,CPU读取的数据均从内存中调取。电脑除了CPU和内存外,我们还有I/O总线来... 查看详情

linux基础05-管道及io重定向

(1)I/O重定向:Linux:>:覆盖输出>>:追加输出(2)set-C:禁止对已经存在文件使用覆盖重定向;强制覆盖输出,则使用>|set+C:关闭上述功能(3)2>:重定向错误输出2>>:追加方式(4)&>:重定向标准输出或错误输出至同一个文... 查看详情

管理及i/o重定向

...出标准输入:键盘标准输出和标准错误输出:显示屏I/O重定向:改变标准输入/输出来源/位置Linux::覆盖输出>:追加输出Set-C禁止对已经存在文件使用覆盖重定向强制覆盖输出,则使用>1Set+C关闭上述功能 查看详情

初学linux之标准i/o和管道

...默认到终端窗口标准输入:0标准输出:1错误输出:2I/O重定向:改变默认位置输出重定向:将标准输出(stdout)和标准错误(stderr)重定向到指定位置格式:命令 查看详情

标准i/o和管道

...终端窗口标准错误(STDERR)-2 默认输出到终端窗口I/O重定向:改变默认位置 >把正确结果输出到文件2>把错误输出到文件&>把所有的输出重定向到文件,不管对错set -C 禁止将内容覆盖已有文件,但 查看详情

linux下的i/o与管道

...目录1.标准输入输出2.输入输出重定向3.tr命令4.管道和tee5.练习 1、标准输入输出   (1)linux给程序提供三种I/O设备      标准输入:(STDIN)   —0  默认接受来自键盘的输入&nbs... 查看详情

带有管道的shell实现和c中的io重定向(代码片段)

...在上学时遇到了很多麻烦。我应该在c中添加管道和I/O重定向到shell实现。我已经得到它与I/O重定向和管道自己工作,但我需要支持这样的“sort<file.txt|grepmain|cat>output”。我不知道如何同时使用它们。任何帮助都会得到很好的... 查看详情