回顾:egrep,扩展的正则表达式,变量,配置文件,算术运算符,条件测试,退出状态码
BRE:
字符匹配:., [], [^]
次数匹配:?, +, *, {m,n}
位置锚定:^, $, \<, \>, \b
分组:(), \1, \2, ...
或者:a|b
变量:
本地变量
环境变量
局部变量
位置变量
特殊变量
命令:unset,export, declare -x, set, env, printenv, readonly
配置文件:
profile,bashrc
算数运算:
let, $[], $(()), expr
+=, -=, *=, /=
++, --
条件测试:
test, [], [[]]
三种:
数值:-lt, -gt, -eq, -ne, -le, -ge
字符串: ==, !=, <, >, =~, -z, -n
文件:
自定义退出码:
exit [n]
[ $# -lt 1 ] && echo "at least one argument." && exit 1
VIM 编辑器:
简介:
vi:Visual Interface,文本编辑器
文本:ASCII,Unicode
文本编辑器种类:
行编辑器:sed
全屏编辑器:nano,vi
VIM - VI IMproved
使用:
vim:模式化的编辑
基本模式:
编辑模式,命令模式
插入模式:
末行模式:
内置的命令行接口
打开文件:
vim [OPTION]... FILE
+#:直接让光标处于第#行的行首
+/PATTERN:直接让光标处于第一个被PATTERN匹配到的行的行首
模式转换:
编辑模式 --> 输入模式
a:append,光标后插入
i:insert,当前光标插入
o:光标当前行下方打开一个新行
A:行首插入
I:行尾插入
O:光标当前行上方打开一个新行
c:
C:
输入模式 --> 编辑模式
ESC
编辑模式 --> 行末模式
:
行末模式 --> 编辑模式
ESC
关闭文件:
:q
:q!
:wq 保存退出
:x 保存退出
ZZ 保存退出
:w /PATH/TO/SOMEWHERE 文件另存为
光标跳转:
字符间跳转:
h, j, k, l
#COMMAND:跳转由#指定的个数的字符
单词间跳转:
w:下一个单词的词首
e:当前或下一个单词的词尾
b:当前或前一个单词词首
#COMMAND: 由#指定一个跳转的单词数
行首行尾跳转:
^:跳至行首第一个非空白字符
0:跳至行首
$:跳至行尾
行间移动:
#G:跳至第#行
G:最后一行
1G,gg:第一行
句间移动:
)
(
段落间移动:
}
{
VIM的编辑命令:
字符编辑:
x:删除光标处的字符
#x:删除光标处起始的#个字符
xp:交换前后字符的位置
字符替换(r,replace)
r:替换光标处的字符
例如:/vvv 替换为 mmmv
光标处于 / 处,输入 3rm 即可
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除
d$
d^
d0
dw
de
db
#COMMAND
dd:删除当前行
#dd:多行删除
粘贴命令(p,paste):
p:缓冲区存在的如果为整行,则粘贴至当前光标所在行的下方;否则,则粘贴至当前所在行的后面
P:缓冲区存在的如果为整行,则粘贴至当前光标所在行的上方;否则,则粘贴至当前所在行的前面
复制命令(y,yank):
y:复制,工作行为与 d 命令相似
y$
y^
y0
yw
ye
yb
#COMMAND
yy:复制行
#yy:复制多行
改变命令(c,change)
c:修改,工作行为与 d 命令相似
编辑模式 --> 输入模式
c$
c^
c0
cw
ce
cb
#COMMAND
cc:删除并输入新内容
#cc:删除多行并输入新内容
其他编辑操作
可视化模式:
v:按字符选定
V:按行选定
注意:经常结合编辑命令使用:
d,c,y
撤销此前的编辑
u(undo)
#u:撤销指定次数的操作
撤销此前的撤销
Ctrl + r
翻屏操作:
Ctrl + f:向文件尾部翻一屏
Ctrl + b:向文件首部翻一屏
Ctrl + d:向文件尾部翻半屏
Ctrl + u:向文件首部翻半屏
vim 自带的练习教程
vimtutor
VIM 中的末行模式
内建的命令行接口
(1) 地址定界
:start_pos,end_pos
#: 具体第#行,例如 2 表示第 2 行
m,n:从 m 到 n 行
m,+n:从 m 行开始,到 m+n 行
.: 当前行
$: 最后一行
.,$-1: 当前行到倒数第二行
%: 全文,相当于1,$
/pattern1/,/pattern2/
从第一次被 pattern1 模式匹配到的行开始,一直到第一次被 pattern2 模式匹配到的行结束
#,/pattern1/
/pattern/,$
使用方式:
后跟一个编辑命令
d
y
w /PATH/TO/SOMEWHERE: 将范围内的行另存只指定的文件中
r /PATH/FROM/SOMEWHERE 将指定位置的内容读取到当前文件中
(2) 查找
/PATTERN: 从当前光标所在处向文件尾部查找
?PATTERN: 从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
(3) 查找并替换
s:在末行模式下完成查找替换操作
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式 -- 注意这里只支持基本正则表达式 BRE
替换为的内容:不能使用模式,但可以使用 \1, \2, ... 等后向引用符号;还可以使用"&"引用前面查找时找到的整个内容
修饰符:
i:忽略大小写
g:全局替换;默认情况下,每一行只替换第一次出现
查找替换中的分隔符"/"可替换为其他字符,例如
s@@@
s###
练习:
1. 复制 /etc/grub2.cfg 至 /tmp 目录,用查找替换命令删除文件中的行首的空白字符
:%s/^[[:space:]]\+//
2. 复制 /etc/rc.d/init.d/functions 文件至 /tmp 目录,用查找替换命令将文件每行开头为空白字符的行的行首加一个“#”号
:%s/^[[:space:]]/#&/g
多文件模式: 多个文件一个窗口
vim FILE1 FILE2 FILE3 ...
:next 下一个
:pre 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 退出所有
窗口分隔模式: 一个文件一个窗口
vim -o|-O FILE1 FILE2 ...
-o:水平分割
-O:垂直分割
在窗口间切换:Ctrl + w, Arrow
单文件窗口分割: 一个文件多个窗口
Ctrl + w, s: split 水平分割
Ctrl + w, v: vertical 垂直分割
定制 vim 的工作特性
配置文件:
全局: /etc/vimrc
个人: ~/.vimrc 默认不存在,需要用户手动创建
末行:当前 vim 进程有效
(1) 行号
显示: set nu -- number
取消显示: set nonu
(2) 括号匹配
匹配: set sm -- showmatch
取消: set nosm
(3) 自动缩进
启用: set ai -- autoindent
禁用: set noai
(4) 高亮搜索
启用: set hlsearch -- highlight
禁用: set nohlsearch
(5) 语法高亮
启用: syntax on
禁用: syntax off
(6) 语法高亮
启用: set ic, -- ignorecase
禁用: set noic
获取帮助:
:help
:help subject
问题:如何设置 tab 缩进为4个字符
练习:
1. 复制 /etc/rc.d/init.d/functions 文件至 /tmp 目录,替换文件中的 /etc/sysconfig/init 为 /var/log
2. 删除 /tmp/functions 文件中所有以“#”开头,且#后面至少有一个空白字符的行的行首的“#”号
bash测试
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
测试表达式的类别:
数值比较
字符串测试
文件测试: 使用 “man bash” 查看帮助,在 1252 行
存在性测试:
-a file
-e file: True if file exists.
存在性级类别测试:
-b file: True if file exists and is a block special file.
-c file: True if file exists and is a character special file.
-d file: True if file exists and is a directory.
-f file: True if file exists and is a regular file.
-h file: True if file exists and is a symbolic link.
-p file: True if file exists and is a named pipe (FIFO).
-S file: True if file exists and is a socket.
-L file: True if file exists and is a symbolic link.
文件权限测试:
-r file: True if file exists and is readable.
-w file: True if file exists and is writable.
-x file: True if file exists and is executable.
文件特殊权限测试:
-g file: True if file exists and is set-group-id.
-u file: True if file exists and its set-user-id bit is set.
-k file: True if file exists and its ``sticky'' bit is set.
文件大小测试:
-s file: True if file exists and has a size greater than zero.
文件是否打开:
-t fd: True if file descriptor fd is open and refers to a terminal.
其他测试命令:
-N file: True if file exists and has been modified since it was last read.
文件存在并自上一次被读取后是否被修改过,比如使用了重定向命令 >, >>
-G file: True if file exists and is owned by the effective group id.
当前有效用户是否为文件的属组
-O file: True if file exists and is owned by the effective user id.
当前有效用户是否为文件的属主
双目测试:
file1 -ef file2: True if file1 and file2 refer to the same device and inode numbers.
FILE1 与 FILE2 是否指向同一个设备上的相同 inode
file1 -nt file2: True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.
FILE1 是否新于 FILE2
file1 -ot file2: True if file1 is older than file2, or if file2 exists and file1 does not.
FILE1 是否旧于 FILE2
例子:判断目录是否存在,不存在则创建目录
[ -e /tmp/test ] || mkdir /tmp/test
组合条件测试:
逻辑运算:
第一种方式
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
例子:判断文件是否存在并且可读
[ -e file ] && [ -r file ]
第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
必须使用测试命令进行
例子:
1. 定义一个本地变量 hostName="hostName",判断 hostName 是否非空,或者等于 “localhost.localdomain”,那么将 hostname 设置为 www.google.com
[ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.google.com
注意这里判断字符串相等,前后的==号不能出现空格
2. 测试 /bin/cat 文件是否存在并且有执行权限,并输出 /etc/fstab 中的信息
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab