1、vim的基本用法
2、vim的高级用法
3、bash编程初步
4、bash算术运算、位置参数和read
一、文本编辑工具 vi vim vimtutor在线帮组文档
全屏编辑器(nano,emacs,vi),行编辑器(sed)
vim三种模式:(visual interface improved)编辑模式、 输入模式、末行模式
编辑模式―>输入模式(i:在光标所在处之前输入a:光标所在处之后输入o:光标下新建一行进入输模 I:在行首进入输入模式、A:在行尾进入输入模式、O:光标上新建一行进入输入模式)
输入模式―>编辑模式:ESC
编辑模式<―>末行模式:
保存退出:(q!:不保存退出、wq:保存退出、x:保存退出、wq!:强制保存退出、zz:编辑模式保存退出)
编辑文本:
光标移动:字符间移动:h:左、j:下、k:上、l:右 ;结合数字如:n{hjkl} 20l
单词间跳转:w:下一次词首、e:当前或下一个词尾、b:当前或前一个词首
行内移动:^ :行首第一个空白字符、0:绝对行首、$:绝对行尾
句子间移动:): 向前跳一句、(::向后跳一句 段落间:}{
行间移动:#G :直接跳转至第#行、G 最后一行
编辑命令:x:删除光标所在处字符 #x:光标处向右删除#个字符
d:删除命令(结合光标跳转字符(w,b,e,$,0,^)使用,删除跳转范围内的字符)、#d
dd:删除光标所在行 ,支持 #dd
d$=D:删除光标到所在行行尾
注意:最后一次删除的内容保存至缓存区,可以粘贴、还原。
p:paste 粘贴 小写p:光标所在处后方 大写P:光标所在上行粘贴
y:yank 复制 (结合光标跳转字符(w,b,e,$,0,^)使用,删除跳转范围内的字符)
如:3yy 复制3行。 大写Y = yy
c:change,修改(先删除,再转换为输入模式)
cc=C:删除光标所在处的正行转换输入 , 支持#cc 3cc
撤销编辑:u :undo,撤销最多50次,支持 #u :撤销最近的#次操作
ctrl+r :撤销上次撤销的命令
. 点号重复前一条命令
二、 末行模式:
行跳转:
内容定界:statrpos,endpos
#:第#行 .:当前行 $:最后一行 10,$-1 :10行至倒数第2行 %:全文,相当于1,$
c,d,y 等命令可以直接附加在地址范围后使用
w /path/to/somefile: 将选定范围内的内容保存至某文件中
r /path/from/somefile:将制定的文件中的内容读取到指定位置
s/查找模式/要替换成的内容/gi (查找模式可以使用正则表达式,要替换成的内容不能使用模式,g:global 全部替换,i:不区分大小写)
练习:
1、复制/etc/rc.d/init.d/functions至/tmp目录,替换/tmp/functions文件的/etc/sysconfig/init为/var/log
%s/\/etc\/sysconfig\/init/\/var\/log/gi
%s@/etc/sysconfig/init@/var/log@gi
2、复制/etc/grub.conf至/tmp目录,删除/tmp/grub.conf文件中的行首的空白字符;
%s@^[[:space:]]\{1,\}@@g
3、复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#号;
%s@^\([[:space:]]\{1,\}.*\)@#\1@
%s@^[[:space:]]\{1,\}.*@#&@
4、删除/tmp/rc.sysinit文件中以#开头且后面跟了至少一个空白字符的行的行首的#号和空白字符;
%s@^#[[:space:]]\{1,\}@@
5、为/tmp/grub.conf文件中前三行的行首加#号;
1,3s@^@#@
6、将/etc/yum.repos.d/CentOS-Media.repo文件中的所有enable=0和gpgcheck=0两行最后的0改为1;
%s@enable=0@enable=1@
%s@\(enable\|gpgcheck\)=0@\1=1@g
vim可视化模式:v:光标划过的字符被选中 V:光标划过的行被选中 d:删除
文本查找:用法同less命令 /pattern 文件首部到尾部的查找, ?pattern 文件尾部到首部的查找,
n查看下一个、N查看上一个、翻屏Ctrl+f向后翻一屏Crrl+b向前翻一屏
多文件模式::next下一个,:previous前一个,:last最后一个,:first第一个,:wqall保存所有文件
多窗口模式: 多文件:vim -o file1 file2 (o垂直窗口,O水平窗口) 窗口间切换ctrl+w +方向箭头
单文件:进行切割Ctrl+w,s水平切割、Ctrl+w,v垂直切割、vim + file跳转到文件末行
窗口属性定义:set nu显示行号, set nonu取消显示行号 (全局文件/etc/vimrc,家目录~/.vimrc)
set ai 自动缩进,set noai取消缩进 ;
set ic 忽略字符大小写 set noic 不忽略字符大小写
set sm显示匹配的另一半括号,set nosm
set hlsearch搜索高亮显示,set nohlsearch取消搜索高亮
syntax (off|on)语法高亮显示关闭或开启。
注意:配置文件 全局有效/etc/vimrc,用户生效~/.vimrc。
三、bash 编程初步
bash进程是一个解释器 (-n 测试语法错误,-x 单步执行显示过程)
shell脚本格式:第一行顶格
#!/bin/bash #!/usr/bin/python
#descriptions:描述
#version:版本号
#author:作者
#date:日期 等 #号开头的行均为注释,会被解释器忽略。
例如:创建一个组newgroup,id号8008、创建一个用户,名字为mageedu,id号为3306,附加组为newgroup
创建目录/tmp/hellobash ,复制/etc/rc.d/init.d/functions至/tmp/hellobash目录中
#!/bin/bash
#author:wenjia
#date:2015.11.09
groupadd -g 8008 newgroup
useradd -u 3306 -G newgroup mageedu
mkdir /tmp/helloabsh
cp /etc/rc.d/init.d/functions /tmp/hellobash 保存为first.sh ,这就是一个脚本。
给脚本赋予执行权限 #chmod +x first.sh 测试脚本 #bash -n first.sh (测试脚本语法错误)
执行脚本./first.sh(脚本文件在当前目录,否则bash会到PATH按顺序查找first.sh文件)
过程式编程语言执行顺序:
顺序执行(顺序执行其中一条命令错误,不影响其他)
选择执行:测试条件,可能会测试多个条件,某条件满足时,执行对应的分支
循环执行:将同一段代码反复执行多次,因此,循环必须有退出条件;否则陷入死循环。
变量类型:本地变量、环境变量(export:导出)、局部变量、位置变量、特殊变量
位置变量:记录所传参数对应信息,如 $1 $2 $3……${10} ;$0
如:#!/bin/bash
# echo $1
# echo $2
# chmod +x third.sh , ./third.sh 11 22
执行结果为 11 22 ,$1为11 $2为22 $0为third.sh 这就是位置变量。
练习:写一个脚本,能接受一个参数作为用户名,此脚本可创建次用户,并且其密码同用户名一样
#vi useradd.sh #chmod +x useradd.sh
#!/bin/bash
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null 这就是一个位置脚本
#./useradd user2015 那么用户user2015创建成功,密码user2015
特殊变量:
$?:状态返回值
$#:传递给脚本参数的个数
如:echo $1 echo $2 echo $n
#./forth.sh 11 22 33 44 执行脚本结果为:11 22 4
$*:显示传递脚本的所有参数($@也可以)
如:echo $1 echo $2 echo $n $*
#./forth.sh 11 22 33 44 执行脚本结果为:11 22 4 11 22 33 44
shift: (轮替位置参数,内置命令)执行完$1后,$2替换原来$1位置继续执行。
如:#!/bin/bash
echo $1 shift echo $1 shift echo $1
./fifth.sh 11 22 33 执行结果为 11 22 33 而不是 11 11 11 。
bash的循环语句:
for:遍历有限的元素列表(适合循环次数已知的环境)
while:(适合循环次数未知的环境)
until:
for语句的格式:
for VAR_NAME in LIST
do
循环体
done
LIST:列表,中间包括一个或多个元素
例如:添加user301……user310 10个用户。
分析:生成数值列表{1..100}或 seq 命令引用
脚本文件,#!/bin/bash
for uno in {301..310};do
或 for uno in $(seq 301 310);do
useradd user${uno}
done
练习:创建目录/tmp/dir-当前日期时间:如/tmp/dir-20140707-155503
在此目录中创建10个空文件夹,分别为file1--file10
#!/bin/bash
dstDir=/tmp/dir-$(date +%Y%m%d-%H%M%S)
mkdir $dstDir
for no in {1..10};do
touch $dstDir/file${no}
done
练习:写一个脚本
1、创建用户tuser1-tuser9;
2、创建目录/tmp/dir-当前日期时间;
3、在/tmp/dir-当前日期时间 目录中创建9个空文件file101-file109
4、将file101的属主改为tuser1,依次类推,一直将file109的属主改为tuser9
#!/bin/bash
dstdir=/tmp/dir-$(date +%Y%m%d-%H%M%S)
mkdir $dstdir
for i in {1..9};do
useradd tuser$i
touch $dstdir/file10$i
chown tuser$i $dstdir/file10$i
done
本文出自 “liwenjia'blog” 博客,谢绝转载!