【基础】bash命令基础及基础特性之一
本篇文章主要讲:命令历史,命令补全,路径补全,命令行展开,命令的执行结果状态,命令别名,glob文件(夹)通配符,bash快捷键,I/O重定向和管道(tr命令讲解)
1、命令历史
history
作用:管理命令历史记录
登录shell时,会读取命令历史文件中记录下的命令:~/.bash_history
登录进shell后新执行的命令只会记录在缓存中;这些命令会用户退出时“追加”至命令历史文件中
参数选项:
-a: 追加本次会话新执行的命令历史列表至历史文件中
-d: 删除历史中指定的命令
-c: 清空命令历史
快捷键操作:
!#: 调用历史中第#条命令;
!string:调用历史中最近一个以string开头的命令;
!!: 上一条命令
!$ 或者先按ESC在按“.”号也可以 【功能是调用上一条命令的参数】
控制命令历史记录的方式:
由环境变量"HISTCONTROL"的值决定
ignoreedups 忽略重复的命令;注意是连续且相同的为重复[默认值]
ignorespace 忽略所有以空格开头的命令
ignoreboth 包含了前两者
2、命令补全
tab键 【前提是用户给定的字符串只有一条且唯一一条相对应的命令
bash执行命令方式:
内部命令:bash自带的命令
外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命令的文件,第一次找到了即为要执行的命令
3、路径补全
tab键 【补全方式和命令补全差不多,但原理不一样】
把用户给出的字符串当做路径的开头,并在其指定上级目录下搜索一指定的字符串开头的文件名
如果唯一,则直接补全
如果不唯一,再次tab键,给出列表
4、命令行展开
{}
举例:mkdir
(1) 如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b, /tmp/x/y2/a, /tmp/x/y2/b
mkdir -p /tmp/x/{y1,y2}/{a,b}
(2) 如何创建x_m, y_m, x_n, y_n
mkdir {x,y}_{m,n}
(3) 如何创建/tmp/bin, /tmp/sbin, /tmp/usr, /tmp/usr/bin, /tmp/usr/sbin
mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}
5、命令的执行结果状态 【注意不是命令的返回值】
命令:# echo $? 0为执行成功;1-255为执行失败
bash使用特殊变量”$?“ 保存最近一条命令的执行状态结果
6、命令别名
命令:# alias
定义别名:
(1)alias 不加参数直接使用
显示当前shell进程所有可使用的命令别名
(2)alias NAME='VALUES' 定义命令别名
注意:在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,则要定义在配置文件中
配置文件的修改生效范围
仅对当前用户有效:~/.bashrc
对所有用户有效:/etc/bashrc
重新读取配置文件:source /path/to/config——file
撤销别名
命令:# unalias 别名名
【note:如果别名同原命令名称相同,则如果要执行原命令,可以使用"\COMMAND" 】
7、glob文件(夹)通配符
通配符:
* 任意长度的任意字符
? 任意单个字符
[] 匹配指定范围内的单个字符
[1-9] 匹配单个数字
[a-z] 不区分字母的大小写
[A-Z] 匹配任意单个大写字符
^ 匹配指定范围外的字符
[^] 匹配指定范围外的单个字符
特殊字符集:
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母
[:upper:]: 任意大写字母
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:space:]:匹配空格字符
[:punct:]:标点符号
【注意: ls /mnt/a[[:digit:]]b == ls /mnt/a*b (注意:在使用特殊字符的时候,需要加两个中括号)】
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
# ls -d /var/l*[0-9]*[[:lower:]]
2、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录
# ls -d /etc/[0-9]*[^0-9]
3、显示/etc/目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
# ls /etc/[^[:alpha:]][[:alpha:]]*
# ls /etc/[^a-z][a-z]*
4、复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/mageedu目录中
# cp -a /etc/m*[^0-9] /tmp/mageedu
5、复制/etc目录下,所有以.d结尾的文件或目录至/tmp/magedu.com目录中
# cp -a /etc/*.d /tmp/magedu.com
6、复制/etc目录下,所以有.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/mageedu.com目录中
# cp -a /etc/[mnrp]*.conf /tmp/mageedu.com
8、bash的快捷键
Ctrl+a 把光标跳转到命令开始处
Ctrl+e 把光标跳转到命令结尾处
Ctrl+u 删除命令行首至光标所在处的内容
Ctrl+k 删除命令行尾至光标所在处的内容
Ctrl+c 取消命令的执行
Ctrl+l 相当于clear命令
q 从文本查阅模式退出至命令行模式
9、I/O重定向
(1)理解三种输入/输出模式
标准输入:keyborad, 0
标准输出:monitor, 1
标准错误输出:monitor, 2
(2)输出重定向 【>,>>】
命令格式:# COMMAND > NEW_POS, COMMAND >> NEW_POS
>:覆盖重定向,目标文件中的原有内容会被清除
>>: 追加重定向,新内容会追加至目标文件尾部
# set -C: 禁止将内容覆盖输出至已有文件中
强制覆盖:>|
# set +C:
2>: 覆盖重定向错误输出数据流
2>>: 追加重定向错误输出数据流
标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向
&>>:追加重定向
COMMAND > /path/to/file.out 2> &1
COMMAND >> /path/to/file.out 2>> &1
(3)输入重定向 【<】,一般情况下,输入重定向只使用一个小于号
tr命令:转换或删除字符
tr [OPTION]... SET1 [SET2]
用法: tr abc ABC FILE
tr -d "abc" FILE
特殊情况:
#cat < /mnt/date.log HERE Documentation:<< 【注意:<< 一般是创建此处文档的意思,对于输入重定向两个小于号没有意义】
# cat << EOF # cat > /path/to/somefile << EOF
举例: [root@oldboy tmp]# cat >date.log<<SS > aaa > bbb > ccc > SS [root@oldboy tmp]# cat date.log aaa bbb ccc [root@oldboy tmp]#
10、管道
语法:COMMAND1 | COMMAND2 | COMMAND3 |...
【Note:最后一个命令会在当前shell进程的子shell进程中执行】
tee命令:【一路输入产生两路输出,但是tee是覆盖输出的】
tee [OPTION]... [FILE]...
tee命令常用参数
格式:tee
只输出到标准输出,因为没有指定文件
格式:tee file
输出到标准输出的同时,保存到文件file中。如果文件不存在,则创建;如果已经存在,则覆盖之
格式:tee -a file
输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,则在源文件后面追加内容
格式:tee -
输出到标准输出两次;如果后面接文件,则会覆盖输出一次。
格式:tee file1 file2 -
输出到标准输出两次,同时保存到file1和file2中