一、vim文本编译器
vi:Visual Interface,文本编辑器; 文本: ASCII Unicode
文本编辑种类:行编辑器:sed ;全屏编辑器:nano,vi ,vim ;其他编辑器:gedit(图形),gvim(vim图形)
使用vi 和vim 的三种主要模式
vim [OPTION]… FILE…
+#: 打开文件后,直接让光标处于第# 行的行首
+/ PATTERN :打开文件后,直接让光标处于第一个被匹配到的行的行首
vim + file 直接打开file, 光标在 最后一行
vim –b file 二进制方式打开文件 ;vim –d file1 file2… 比较多个文件
vim -m file 只读打开文件 ex file 或 或 vim –e 直接进入ex 模式
v 如果该文件存在,文件被打开并显示内容;如果该文件不存在,当编辑后第一次存盘时创建它
1.1三种主要的模式
命令模式(默认):移动光标。剪切/粘贴文本 ;插入(编辑)模式:修改文本;扩展命令模式:保存,退出。
Esc:总是返回命令模式
移动光标,进入插入模式、扩展模式、命令模式
1.1.1命令模式——>>插入模式
i: insert, 在光标所在处输入 ;I :在当前光标所在行的行首 输入
a: append, 在光标所在处后面输入 ;A :在当前光标所在行的行尾 输入
o: 在当前光标所在行的下方打开一个新行 ;O :在当前光标所在行的上方打开一个新行
锁定和解锁:Ctrl+s ;Ctrl+q
扩展模式:q 退出 ; :q! 强制退出,丢弃做出的修改
:wq 保存退出 ; :x 保存退出
r filename : 读取filename内容到当前文件中 ; w filename:将当前文件的内容写入到filename中
!command:执行命令 ; r!command:读入命令的输入
1.1.2 扩展模式:地址定界
地址定界:start_pos ,eed_pos
#,+#:如2,+3 表示2到5行 .:当前行 $:最后一行 %:全文,相当于1,$
/pat1/ ,/pat2/:从第一次被pat1 模式匹配到的行开始,一直到第一次被pat2 匹配到的行结束
#,/pat/:从第#行开始,一直到第一次被pat2 匹配到的行结束
/pat/,$ :从第一次被pat 模式匹配到的行开始,一直到行结束
查找:/PATTERN :从当前光标所在处向文件尾部查找 ;?PATTERN :从当前光标所在处向文件首部查找
n :与命令方向相同 ;N:与命令方向相反
替换(s): 在扩展模式下完成查找替换操作
格式:s/ 要查找的内容/ 替换为的内容/ 修饰符; 要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&” 引用前面查找时查找到的整个内容。
修饰符: i: 忽略大小写; g: 全局替换;默认情况下,每一行只替换第一次出现
gc: 全局替换,每次替换前询问
查找替换中的分隔符/可替换为其它字符,例如:s@/etc@/var@g s#/boot#/#i
1.1.3命令模式
ZZ:保存退出 ; ZQ:不保存退出
字符间跳转:h: 左 ;l: 右 ; j: 下 ; k: 上 ; #COMMAND :跳转由# 指定的个数的字符
单词间跳转:
w :下一个单词的词首; e :当前或下一单词的词尾
b:当前或前一个单词的词首; #COMMAND :由# 指定一次跳转的单词数
当前页跳转:
H :页首 ; M:页中间行 ; L:页底 行首行尾跳转:
行首行尾跳转:
^: 跳转至行首的第一个非空白字符;0: 跳转至行首;$: 跳转至行尾
行间移动:#G 、扩展 模式:# :跳转至由# 指定行;G :最后一行;1G, gg: 第一行
翻屏操作:
Ctrl+f: 向文件尾部翻一屏 ; Ctrl+b: 向文件首部翻一屏
Ctrl+d: 向文件尾部翻半屏 ; Ctrl+u:向文件首部翻半屏
字符编辑:
x: 删除光标处的字符;#x: 删除光标处起始的# 个字符
xp: 交换光标所在处的字符及其后面字符的位置 ; ~:转换大小写
替换命令:r:替换光标所在处的字符
删除命令d: d$:删除到行尾; d^:删除到非空行首; d0:删除到行首;dd:删除光标所在的行
#dd:多行删除; D:从当前光标位置一直删除到行尾,等同于d$。
复制命令(y,yank):y:复制,行为相似于d命令 yy:整行复制; Y:从光标位置复制到行尾
#yy:复制多行
粘贴命令(p,paste):p:缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面。
改变命令:(c)修改后切换至插入模式。同删除复制命令。
撤销更改: u 撤销最近的更改; #u 撤销之前多次更改; U 撤消光标落在这行后所有此行的更改
按Ctrl – r 重做最后的“撤消”更改; . 重复前一个操作; v n.:重复前一个操作n次
特殊用法:100iwang [ESC] :粘贴“wang ”100次
<start position><command><end position>
Command: y 复制、d 删除、gU 变大写、gu 变小写
如 例如 0y$ 命令意味着:
0 → → 先到行头 ;y → → 从这里开始拷贝; $ → → 拷贝到本行最后一个字符
ye:从当前位置拷贝到本单词最后一个字符
1.2 vim寄存器
有26 个命名寄存器和1 个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。
用a ,b,…,z 表示, 用“ 寄存器表示,放在数字和命令之间
如:3"tyy 表示复制3 行到t 寄存器中
"tp 表示将t 寄存器内容粘贴
未指定,将使用无命名寄存器
有10 个数字寄存器,用0 ,1 ,… ,9 表示,0 存放最近复制内容,1 存放最近删除内容。当新的文本变更和删除时,1 转存到2 ,2 转存到3 ,以此类推。数字寄存器不能在不同会话间共享
编辑二进制文件:
以二进制方式打开文件 vim –b binaryfile
扩展命令模式下,利用xxd 命令转换为可读的十六进制 :%!xxd
编辑二进制文件
扩展命令模式下,利用xxd 命令转换回二进制 :%!xxd –r
保存退出
可视化和多窗口
1.3 定制vim的工作特性
配置文件:永久有效 全局:/etc/vimrc ;个人:~/.vimrc
扩展模式:当前vim 进程有效
(1) 行号
显示:set number, 简写为set nu ;取消显示:set nonumber, 简写为set nonu
(2) 括号成对匹配
匹配:set showmatch, 简写为set sm ;取消:set nosm
(3) 自动缩进
启用:set ai ;禁用:set noai
(4) 高亮搜索
启用:set hlsearch ;禁用:set nohlsearch
(5) 语法高亮
启用:syntax on ;禁用:syntax off 、shirt:noh回车
(6) 忽略字符的大小写
启用:set ic ;不忽略:set noic
(7) 文件格式
启用windows 格式:set fileformat=dos ;启用unix 格式:set fileformat=unix
(8) 设置文本宽度
:set textwidth=65 (vim only) ; :set wrapmargin=15
:help option-list ; :set or :set all
vi/vim内置帮助
:help ; :help topic ; Use :q to exit help
vimtutor
二、*shell脚本编程
2.1 shell的简单介绍
编程基础 : 程序:指令+数据
程序编程风格:过程式:以指令为中心。数据服务于指令。
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程的能力,解释执行
程序的执行方式:计算机运行二进制指令
编程语言:低级语言:汇编语言
高级语言:编译:高级语言à编译器—>目标代码 (java,c,c++)
解释:高级语言—>解释器—>机器代码 (shell ,prel,python)
编程的基本概念:
编辑逻辑处理方式:顺序执行 循环执行 选择执行
shell编程:过去式、解释执行
编程语言的基本结构:
数据存储:变量、数组 表达式:a+d 语句:if
shell脚本基础
shell脚本是包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行执行shebang机制:
#!/bin/bash #!/usr/bin/python #!/usr/bin/perl
2.2 shell脚本的用途
1、自动化常用命令;2、执行系统管理和故障排除;3、创建简单的应用程序;4、处理文本或文件
创建shell脚本:
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!/bin/bash ;添加注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径;直接运行解释器,将脚本作为解释器程序的参数运行
脚本调试:
bash –n /path/to/some_script(脚本名) :检查第几行的语法错误,不能检查到命令的错误
删除PATH变量的命令的脚本路径;同时还需要用hash –d cmd 清除路径
bash –x /path/to/some_script:调试执行
bash:即使脚本没有执行权限,也可以用bash运行
2.3 变量
变量:命令的内存空间
数据的存储方式: 字符; 数值:整型;浮点型
变量作用:1.数据存储格式;2.参与的运算;3.表示数据范围
类型:字符;数值:整型、浮点型
强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误如:java,pyrhon
弱类型:无须指定类型,默认为字符型;参与运算会自动进行隐式类型转换;变量无需事先定义可直接调用
如:bash不支持浮点数
变量的命名法则:
1.不能使用程序中保留字:如if,for ; 2.见名知义
3.只能使用数字、字母、和下划线,且不能以数字开头; 4.统一命名规则:驼峰命名法
bash中变量的种类:
2.3.1本地变量
生效范围为当前shell进程,对当前shell之外的其他shell(包括子shell)进程都无效 当然子shell进程的变量也不能在父进程中生效。
变量赋值:name=”value”
可以使用引用的value的条件:
(1)可以是直接字串:name=”root” ;(2)变量引用:name=”$USER” ;
(3)命令引用:name=`COMMAND` ; name=$(command) ;
变量引用:${name} ,$name
“”:弱引用,其中的变量引用会被替换为变量值 ; ‘’:强引用,其中的变量引用保持原字符串
set命令可以查看系统定义的所有变量,还有函数; 删除变量:unset name
编写的脚本相当于子进程,可以直接使用系统定义的环境变量。
pstree显示当前的进程树; 脚本中sleep表示休眠一会儿,利于查看进程树
2.3.2 环境变量
用export(等价于declare – x)声明能把父进程的变量传递给子进程,但是如果子进程设置的环境变量与父进程冲突,那父进程中显示的是子进程的变量。而且子进程定义的变量不会传递给父进程。(bash特殊例外)
变量声明、赋值:export name =value ; declare –x name =value
变量引用:${name} ,$name
env、printenv、export命令可以所有显示环境变量; 删除变量:unset name
bash中有许多内建的环境变量:PATH,SHELL,USER,UID,HISTSIZE,HOME,PWD,OLDPWD,HISTFILE
局部变量
生效范围为当前shell进程中某代码片段(通常指函数)fun1() { locate var=function; },只在函数中使用。
只读变量
只能声明,不能修改删除: readonly name ; declare -r name
2.3.3 位置变量
$1,$2,$3……来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
$1, $2, … :对应第1 、第2 等参数,shift [n] 换位置 但是到$10就必须用${10} ;$0: 命令本身
示例:判断给出的文件的行数
linecount="$(wc -l $1| cut -d' ' -f1)" echo “$1 has $linecount lines.”
2.3.4 特殊变量:$?,$0,$*,$@,$#
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数 ;$@ 与$* 只在被双引号包起来的时候才会有差异
2.4 bash中的算术运算
help ;let +, -, *, /, % 取模(取余), ** (乘方)
实现算术运算:
(1) let var= 算术表达式 ; (2) var=$[ 算术表达式 ](表达式前后有空格) ; (3) var=$(( 算术表达式 ))
(4) var=$(expr arg1 arg2 arg3 …) ; (5) declare -i var = 数值 ; (6) echo ‘ 算术表达式’| bc
乘法符号有些场景中需要转义 ; [[ ]]:两个括号才能支持正则表达式
bash 有内建的随机数生成器:$RANDOM (1-32767)
echo $[$RANDOM%50] :0-49之间的随机数
赋值:增强型赋值: += ,-= ,*= ,/= ,%=
let var(变量)OPERvalue 例如:let count+=3 ,自加3后自赋值
自增,自减: let var+=1 , let var++ , let var-=1 , let var—
(注意:变量用完了,注意unset,要不然可能与bash中运行的起冲突)
2.4.1 逻辑运算
true 用1表示;false用0表示
与:1 与 1 = 1; 1 与 0 = 0; 0 与 1 = 0; 0 与 0 = 0 (取小)
或:1 或 1 = 1; 1 或 0 = 1; 0 或 1 = 1; 0 或 0 = 0 (取大)
非!: !1=0 ; !0=1
2.4.2 短路运算
短路与:第一个为0 ,结果必定为0;第一个为1,第二个必须参加运算
短路或:第一个为1,结果必然为1;第一个为0,第二个必须参加运算
异或:^ 异或的两个值,相同为假,不同为真
聚集命令:复合式:date;who | wc -l (命令会一个接一个地运行)
子shell:(date;who | wc -l)>> /tmp/trace (所有的输出都会被发给单个标准输出和错误输出)
退出状态:进程使用退出状态来报告成功或失败 ;
0:代表成功;1-255:代表失败 ; $?:变量保存最近命令的退出状态(shell中最后一个命令)
例如: #ping –c1 –w1 hostdown &> /dev/null && echo the host is up (用来扫描网段是否开通)
退出状态码:exit [n] :自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即退出;终止退出状态取决于exit命令后面的数字(0:成功)
注意:如果未给脚本指定退出状态码,整个脚本退出状态码取决于脚本执行的最后一条命令状态码
2.5 编写shell脚本
2.5.1 条件测试
判断某需求是否满足,需要由测试机制来实现;专用的测试表达式需要由测试命令辅助完成
评估布尔声明 ,以便在条件性执行使用 若成功(为真),则返回0;若失败(为假),则返回1。
测试命令:test expression ; [ expression ] ;[[ expression ]];(注意:expression 前后必须要有空白字符)
条件性的执行操作符:根据退出状态而定,命令可以有条件的运行
&&表示条件性的and ,then 若cmd1执行完毕且$?=0,则开始执行cmd2;若cmd1$?≠0,则不执行cmd2
||表示条件性的or else 若cmd1执行完毕且$?=0,则不执行cmd2;若cmd1$?≠0,则继续执行cmd2
test命令:长格式的例子:
$test “$A” == “$B” && echo “Strings are equal” (比较字符串是否相等)
$ test “$A” –eq “$B” && echo “Integers are equal” (比较数字是否相等)
简单格式的例子:
$[ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” –eq “$B” ] && echo “Integers are equal”
2.5.2 数值测试
-gt:是否大于 ;-ge:是否大于等于 ;-eq是否等于
-lt:是否小于 ;-le:是否小于等于 ;-ne:是否不等于
常在if结构中出现
2.5.3 字符串测试
== :是否等于; >: ascii 码是否大于ascii码 ; <: 是否小于
!=: 是否不等于 ; =~: 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]] 中;扩展的正则表达式
-z "STRING" :字符串是否为0个,空为真,不空为假
-n "STRING" :字符串是否不为0个,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
2.5.4文件测试
2.5.4.1 存在性测试
–a FILE :同-e ; -e FILE: 文件存在性测试,存在为真,否则为假
存在性及性能测试:-b FILE :是否存在且为块 设备文件
-c FILE :是否存在且为字符 设备文件 ; -d FILE :是否存在且为 目录文件
-f FILE :是否存在且为 普通文件 ; -h FILE 或 或 -L FILE :存在且为符号 链接文件
-p FILE :是否存在且为命名 管道文件 ;-S FILE :是否存在且为套接先判断存在性,再判断类型
注意:-f有一个坑,会判断链接文件指向的文件或者目录;
因而,判断文件类型,先判断文件是否存在,再判断文件是否是链接文件,最后才判断文件类型
例如:/bin 是一个特殊的链接文件 find查找bin下的目录 必须用 find /bin/
2.5.4.2 文件权限测试
-r FILE :是否存在且可读 ;-w FILE: 是否存在且可写 ;-x FILE: 是否存在且可执行
注意:-x:文件没有x的话即使是root也没有执行权限
文件特殊权限测试:-u FILE :是否存在且拥有suid 权限 ;
-g FILE :是否存在且拥有sgid 权限 ; -k FILE :是否存在且拥有sticky 权限
2.6.3 文件大小测试
-s FILE:是否存在且非空
文件是否打开: -t fd: fd 表示文件描述符是否已经打开且与某终端相关
-N FILE :文件自动上一次被读取之后是否被修改过
-O FILE :当前有效用户是否为文件属主 ; -G FILE :当前有效用户是否为文件属组
2.5.5 双目测试
FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设备上的相同inode
FILE1 -nt FILE2: FILE1 是否新于FILE2 ; FILE1 -ot FILE2: FILE1 是否旧于FILE2
2.5.6 组合测试
第一种方式:
COMMAND1 && COMMAND2 并且 ; COMMAND1 || COMMAND2 或者
! COMMAND 非 如:[[ -r FILE ]] && [[ -w FILE ]]是否为可读和可写文件
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且 ; EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION 非 ;必须使用测试命令进行; 格式必须要严格,必须是单个括号;多个括号就不能匹配-a,-o了;
v示例:# [ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname www.magedu.com
空字符串$HOSTNAME或者主机名为localhost.localdomain,就执行homename改为www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
/bin/cat文件为可执行且普通文件,就执行访问/etc/fstab
2.6 read命令来接受输入
使用read来把输入值分配给一个或多个shell变量:
-p:指定要显示的内容,相当于echo,备注信息 ; -t :输出时间
read – p “Enter a filename:” FILE (FILE前面有空格)
read 从标准输入中读取值,给每一个单词分配一个变量所有剩余单词都被分配给最后一个变量。
使用read功能接收输入内容:读变量如:read name echo $name
vim inputyourname
#!/bin/bash
#
#echo “please input your name ”
read –t 3 –p “please input your name:” name
echo “your name is $name”
read –p “Do you agree ? yes or no:”answer
[ $answer==yes ]&&echo “haha”|| echo “hehe”
按生效范围划分,存在两类:
全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc
个人配置:~/.bash_profile ~/.bashrc
建议修改用户登录是的信息建议在/etc/profile.d/*.sh 中
source和bash的区别: bash 会影响子进程的脚本 ;source仅影响自己本身的脚本
3.1 shell登录的两种方式
3.1.1 交互式登录
(1) 直接通过终端输入账号密码登录;(2) 使用“su – UserName” 切换的用户
执行顺序:/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc
profile类:为交互式登录的shell提供配置:
全局:/etc/profile 、/etc/profile.d/*.sh ;个人:~/.bash_profile
功用:(1)用于定义环境变量 ; (2):运行命令和脚本
3.1.2非交互式登录
(1)su UserName ;(2) 图形界面下打开的终端 ;(3) 执行脚本
执行顺序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
bashrc 类:为非交互式和交互式登录的shell提供配置:
全局:/etc/bashrc ; 个人:~/.bashrc
功用:(1)定义命令别名和函数 ;(2)定义本地变量
3.2 编辑配置文件生效
修改profile和bashrc文件后需生效的两种方法:
1.重新启动shell进程 ; 2. .或source 例如: .~/.bashrc
bash保存在~/.bash_logout文件中(用户);在退出登录shell时运行;用于创建自动备份、清除临时文件。
du sh file 可以查看文件file的大小,便于查看清除不需要的临时文件
3.3bash如何展开命令行
1.把命令行分成单个命令词 2.展开别名 3.展开大括号种的声明({})
4. 展开波浪符声明(~) 5.命令替换$() 和 “ 6.再次把命令行分成命令词
7.展开文件通配(* 、? 、[abc] 等等) 8.准备I/0 重导向(< 、>) 防止扩展
反斜线(\ )会使随后的字符按原意解释
如:$ echo Your cost: \$5.00 Your cost: $5.00
加引号来防止扩展: 单引号(’ )防止所有扩展
双引号(” )也防止所有扩展,但是以下情况例外:
$ (美元符号) - 变量扩展 ; ` (反引号) - 命令替换
\ (反斜线) - 禁止单个字符扩展 ; ! (叹号) - 历史命令替换
原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/60601