Bash的基础特性1
1.命令历史 History
1.1环境变量:
HISTSIZE: 命令历史记录的条数;
HISTFILE:~/.bash_history;
HISTFILESIZE : 命令历史文件记录历史的条数
History -d OFFSET
-c
History # : 显示历史中最近的#条命令;
-a: 手动追加当前会话缓冲区的命令历史至历史文件中;
1.2调用历史中的命令:
!#:重复执行执行第#条指令;
!!:重复执行上一条命令;
!string:重复执行string这条命令;
1.3调用上一条命令的最后一个参数:
!$ | ESC键 . | Alt+.
2.控制命令历史的记录方式:
环境变量: HISTCONTROL
Ignoredups :忽略重复的命令,连续且相同方为“重复”
Ignorespace :忽略所有以空白开头的命令;
Ignoreboth :Ignorespace Ignoredups
3.修改环境变量值的方式: export 变量名=“值”
变量赋值:把赋值符号后面的数据存储于变量名指向内存空间;
4.命令补全:
4.1bash执行命令:
内部命令:
外部命令:bash根据PATH环境变量定义的路径,自左至右宰每个路径搜寻以给定命令;
直接补全: Tab ,用户给定的字符串只有一条唯一对应的命令;则再次Tab会给出列表;
4.2.路径补全
把用户给出的字符串当作路径开头,并在其指定上级目录搜索以指定的字符串开头的文件名;
如果唯一,直接补全。
不唯一再次Tab,给出列表
5.命令行展开
~ : 展开为用户的主目录;
~USERNAME :展开为指定用户的主目录;
{} :可承载一个以逗号分隔的列表,并将其展 开为多个路径;
6.命令的执行状态结果:
成功
失败
bash 使用特殊变量$?保存最近一条命令的执行状态结果;
0 :成功;
1-255 : 失败
程序执行有两类结果: 1〉程序的返回值;
2> 程序的执行状态结果;
7.命令别名(alias)
(1).alias
显示当前shell进程所有可用的命令别名:
(2). alias NAME=’VALUE’
定义别名NAME,其相当于执行命令VALUE
注意:在命令行中定义的别名,进程当前shell进程有效;如果想永久有效,要定义在配置文件中:
仅对当前用户: ~/.bashrc
对所有用户:/etc/bashrc
定义完想要生效需要做一下操作bash进程重新读取配置文件:
source /path/to/config_file
. /path/to/config_file
(3).撤销别名: unalias
unalias [-a] name [name.....]
Note:如果别名同原命令的名称,则如果要执行原命令,可使用“\COMMAND”;
8.glob(globbing)bash中用于实现文件名“通配“用于文件名或目录名的匹配,不要与grep混淆
通配符 : *, ?,[]
(1) *
任意长度的任意字符
a*b:
aab, ab, a1122b
(2) . ?
任意单个字符
a?b
a1b.aab
(3) []
匹配制定范围内的任意单个字符
[abc] : a,b,c 中选一个
[0-9] : 0-9任意其中一个数字
[a-z] : 不区分字符的大小写
[A-Z] : 大写
(4) [^]
匹配制定范围之外的任意单个字符
专用字符集合:
[:digit:] : 任意数字,相当于[0-9]
[:alnum:] : 任意数字或字母
[:lower:] : 任意小写字母,相当于[^A-Z]
[:upper:] : 任意大写字母
[:alpha:] : 任意大小写字母
[:alnum:] : 任意字母或数字
[:space:] : 空白
[:punct:] : 标点符号
练习1:
1.显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录:
[root@chang ~]# ls -d /var/l*[0-9]*[[:lower:]]
2.显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录:
[root@chang ~]# ls -d /etc/^[0-9]*[^0-9]
3.显示/etc目录下,以非字母开头,后面跟了一个字母及其他任意长度任意字符的文件或目录:
[root@chang ~]# ls /etc/[^[:alpha:]][[:alpha:]]*
4.复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/chang目录下:
[root@chang ~]# cp -a /etc/m*[^0-9] /tmp/chang
5.复制/etc目录次啊,所有以.d结尾的文件或目录至/tmp/chang.com目录中:
[root@chang ~]# cp -a /etc/*.d /tmp/chang.com
6.复制/etc目录次啊,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/cc目录中:
[root@chang ~]# cp -a /etc/[mnrp]*.conf /tmp/cc
9.bash 的快捷键:
ctrl+l: 清屏,相当于clear;
ctrl+a: 跳转至命令开始处
ctrl+e : 跳转至命令结尾处
ctrl+c : 取消命令的执行
ctrl+u : 删除命令行首至光标所在处的所有内容;
ctrl+k : 删除光标所在处至命令行尾部的所有内容;
10.bash的I/O重定向及管道
程序: 指令+数据
读入数据: input
输出数据: output
打开的文件都有一个fd: file descrtptor (文件描述符)
标准输入:keyboard , 0
标准输出:monitor, 1
标准错误输出: monitor, 2
11.I/O重定向: 改变标准位置
11.1输出冲定向: COMMAND > NEW_POS, COMMAND >> MEW_POS
>: 覆盖重定向,目标文的原有无内容会被清除;
>>: 追加重定向,新内容会追加至目标文件尾部;
11.2 # set �CC: 禁止将内容覆盖输出至已有文件中;(只对当前进程有效)
强制覆盖: >|
# set +C:
11.3 (1) 2>: 覆盖重定向错误输出数据流:
2>>: 追加重定向错误输出流;
(2)标准输出和错误输出各自定向至不同位置:
COMMAND > /PATH/to/file.out 2> /path/to/error.out
11.4合并标准输出和错误输出同一个数据流进行重定向:
&> : 覆盖重定向 &>> :追加重定向
COMMAND > /path/to/file.out 2> &1
COMMAND >> /path/to/file.out 2>> &1
11.5输入重定向: <
显式使用:tr
隐式使用:….
12.Tr命令:转换或删除字符
tr [option ]… SET1 [SET2]
HERE Documentation : <<EOF :end off file
# cat <<EOF
# cat > /path/to/somefile <<EOF
管道:
COMMAND1 | COMMAND2 |COMMAND3 …
Note : 最后一个命令会在当前shell进程的子进程中执行Tee命令:
tee [OPTION]... [FILE]...
练习2
1.将/etc/passwd文件中的前5行内容转换为大写保存至/tmp/passwd.out文件中:
[root@chang ~]# tail -n 2 /etc/passwd | tr'a-z' 'A-Z' >/tmp/passwd.out
2.将登录至当前用户信息的后3位的信息转换为大写后保存至/tmp/who.out中:
[root@chang ~]# who | tail -n 3 | tr 'a-z' 'A-Z' >/tmp/who.out