shell脚本常识
--------------------------------------------------------------- -------------- 概要 ---------------------------------------------------------------------------
七种文件类型
正则表达式
字符类描述
shell的引号类型
变量设置时的不同模式:
条件测试
命令执行顺序
脚本调试
创建一个长度为0的空文件
一些常用的shell变量
$0的使用
Shift的运用
用head或tail指令指定查阅的行数
LINUX常用脚本和函数
LINUX常用命令
关于文件/目录处理的指令:
关于 Process 处理的指令:
关于字符串处理的指令:
联机查询的指令:
网络运用指令:
VI常用技巧
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
七种文件类型
d 目录 l 符号链接
s 套接字文件 b 块设备文件
c 字符设备文件 p 命名管道文件
- 普通文件
正则表达式
从一个文件或命令输出中抽取或过滤文本时。可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。基本的元字符集:
^ 只匹配行首。 $ 只匹配行尾。 * 一个单字符后紧跟*,匹配0个或多个此单字符。 [] 匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用-来表示[]内范围,如 [1-5]等价于[1,2,3,4,5]。 \ 屏蔽一个元字符的特殊含义,如\$表示字符$,而不表示匹配行尾。
. 匹配任意单字符。
pattern\{n\} 匹配pattern出现的次数n
pattern\{n,\}m 匹配pattern出现的次数,但表示次数最少为n
pattern\{n,m\} 匹配pattern出现的次数在n与m之间(n,m为0-255)
几个常见的例子:
显示可执行的文件:ls –l | grep …x...x..x
只显示文件夹:ls –l | grep ^d
匹配所有的空行:^$
匹配所有的单词:[A-Z a-z]*
匹配任一非字母型字符:[^A-Z a-z]
包含八个字符的行:^……..$(8个.)
字符类描述
以下是可用字符类的相当完整的列表:
[:alnum:] 字母数字 [a-z A-Z 0-9] [:alpha:] 字母 [a-z A-Z] [:blank:] 空格或制表键 [:cntrl:] 任何控制字符 [:digit:] 数字 [0-9] [:graph:] 任何可视字符(无空格) [:lower:] 小写 [a-z] [:print:] 非控制字符 [:punct:] 标点字符 [:space:] 空格 [:upper:] 大写 [A-Z] [:xdigit:] 十六进制数字 [0-9 a-f A-F]
尽可能使用字符类是很有利的,因为它们可以更好地适应非英语 locale(包括某些必需的重音字符等等).
shell的引号类型
shell共有四种引用类型:
“ ” 双引号 ‘ ’ 单引号
` ` 反引号 \ 反斜线
l “ ” 可引用除$、` 、\ 、外的任意字符或字符串,“ ”中的变量能够正常显示变量值。
l ‘ ’与“ ”类似,不同在于shell会忽略任何的引用值。
例如: GIRL=‘girl’
echo “The ‘$GIRL’ did well”
则打印:The ‘girl’ did well
l ` `用于设置系统命令的输出到变量,shell会将` `中的内容作为一个系统命令并执行质。
例如:echo `date` 则打印当前的系统时间。
l \ 用来屏蔽特殊含义的字符:& * + ^ $ ` “ | ?
例如:expr 12 \* 12 将输出144
变量设置时的不同模式:
valiable_name=value 设置实际值到 variable_name中 valiable_name+value 如果设置了variable_name,则重设其值 valiable_name:?value 如果未设置variable_name,则先显示未定义用户错误信息 valiable_name?value 如果未设置variable_name,则显示系统错误信息 valiable_name:=value 如果未设置variable_name,则设置其值 valiable_name-value 同上,但取值并不设置到variable_name
条件测试
test命令用于测试字符串、文件状态和数字,expr测试和执行数值输出。
Test格式:test condition 或 [ condition ](需要特别注意的是condition的两边都要有一个空格,否则会报错),
test命令返回0表示成功。
下面将分别描述test的三种测试:
文件状态测试(常用的)
-d 测试是否文件夹 -f 测试是否一般文件 -L 测试是否链接文件 -r 测试文件是否可读 -w 测试文件是否可写 -x 测试文件是否可执行 -s 测试文件是否非空
字符串测试
五种格式:
test “string”
test string_operator “string”
test “string” string_operator “string”
[ string_operator “string” ]
[ “string” string_operator “string” ]
其中string_operator可以为: = 两字符串相等
!= 两字符串不等
-z 空串
-n 非空串
数值测试
两种格式: “number” number_operator “number” [ “number” number_operator “number” ] 其中:number_operator 可以为:-eq 、-ne、-gt、-lt、-ge 例如: NUMBER=130 [ “990” –le “995” –a “NUMBER” -gt “133” ] (其中-a表示前后结果相“与”)
expr命令一般用于整数值,但也可以用于字符串。
格式: expr srgument operator operator argument 例如: expr 10 + 10 expr 10 ^ 2 (10的平方) expr $value + 10 增量计数――expr在循环中最基本的用法 例如: LOOP=0 LOOP=`expr $LOOP + 1`
模式匹配:通过指定的冒号选项计算字符串中的字符数 例如: value=account.doc expr $value : `\(.*\).doc` 输出 account
命令执行顺序
&& 成功执行一个命令后再执行下一个 || 一个命令执行失败后再执行另一个命令 ( ) 在当前shell中执行一组命令(格式:(命令1;命令2; ……)) { } 同( ) 例如: comet mouth_end || ( echo “hello” | mail dave ;exit ) 如果没有( ),则shell将直接执行最后一个命令(exit)
脚本调试
最有用的调试脚本的工具是echo命令,可以随时打印有关变量或操作的信息,以帮助定位错误。也可使用打印最后状态($?) 命令来判断命令是否成功,这时要注意的是要在执行完要测试的命令后立即输出$?,否则$?将会改变。
Set命令也可以用来辅助脚本测试:
Set –n 读命令但是不执行
Set –v 显示读取的所有的行
Set –x 显示所有的命令及其参数
(要关闭set选项,只要把-换成+就可以了,这里有点特殊,要注意一下)
创建一个长度为0的空文件
执行 > file_name 命令或 touch file_name 命令。
一些常用的shell变量
$# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数(可大于9个) $$ 脚本运行的当前进程的ID号 $! 后台运行的最后一个进程的ID号 $@ 与$#相同,但使用时加引号,并在引号中返回每个参数 $- 显示shell使用的当前选项 $? 显示最后命令的退出状态,0表示无错误(这个变量也常常用来打印输出,在脚本调试时标记某个shell命令或某个函数是否正确执行,但是要注意,$?记载的是最近的函数或命令的退出状态,因此打印时应该立即打印以获得正确的信息)
$0的使用
在变量中有一种位置变量$n,用来存放函数调用或脚本执行时传入的参数,其中$0表示函数名或脚本名,需要注意的是,这时的脚本名传递的是包含全路径的脚本名。从$1-$9表示传入的第一到第九个参数,这样的参数表示不能多于九个,如果多于九个,可以使用下面将要提到的shift指令来读取。
因为$0存放函数名或脚本名,因此我们可以通过echo $0来输出调用信息,但是,由于存放的是全路径名,我们可以利用一个shell命令来得到脚本名,
basename $0 将得到$0中名字的部分,而与之相反的,dirname $0将得到$0中路径的部分。
用head或tail指令指定查阅的行数
例如:查阅文件前20行: head –20 file_name
查阅文件后10行: tail –10 file_name
linux常用脚本和函数
#查找当前目录中是否存在指定目录,若不存在,则创建之
function mkdir_1 { if test ! -d $1 then mkdir $1 fi }
#将指定文件中的"prefix = .*"串替换为"prefix=\/home\/gnome-unicore-install2\/usr/"
#可以用来作为sed用法的参考 function modify_prefix { chmod +w $1 cp $1 $1.bak sed 's/prefix = .*/prefix=\/home\/gnome-unicore-install2\/usr/g' $1.bak > $1 rm $1.bak }
#将指定文件中的"^LDFLAGS =.*"串替换为"LDFLAGS = -rdynamic -lgdk_pixbuf -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm"
#change_gnome-config FILENAME function change_gnome-config { cp $1 $1.bak sed 's/^LDFLAGS =.*/LDFLAGS = -rdynamic -lgdk_pixbuf -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm /g' $1.bak> $1 rm $1.bak }
#删除指定文件的含有指定字符的行
#格式:delete_line filename "word_contain"
function delete_line { chmod +w $1 cp $1 $1.bak cat $1.bak | grep -v -e "$2" >$1 }
#用途:删除文件中包含line1或(和?)line2的行
#格式:delete_line filename line1 line2 function delete_line_no { chmod +w $1 cp $1 $1.bak sed $2,$3'd' $1.bak>$1 rm $1.bak }
#用途:在LINE_NO指定的行插入字符串CONTENT
#可以用来作为sed用法的参考 #格式: add_line FILENAME LINE_NO CONTENT function add_line { chmod +w $1 cp $1 $1.bak sed -e $2 'i\' "$3" '' $1.bak > $1 rm $1.bak }
#用途:检查含有"PC24"代码的程序并打印出来
#格式: check_PC24 //after installation function check_PC24 { echo "now comes the PC24 checking..." . $COMMAND_UNICORE/shell/shell_PC24 >& /dev/null if test -s $COMMAND_UNICORE/PC24_result then : echo "The following file contains PC24 problems: $COMMAND_UNICORE/PC24_result " else echo "No PC24 problem found" fi }
#打印标题
displayheader() { echo " *****************************************" echo " * IeeeCC754 testing tool *" echo " *****************************************" echo " " }
#打印一个菜单的做法
displayplatformmenu() { #clear the screen clear displayheader echo " a) SunSparc " echo " b) IntelPentium " echo " c) AMD " echo " d) Unicore32 " echo " e) Unicore32(with FP2001) " echo " " echo -n " select a Platform > " }
#查找当前目录下是否存在file_name文件
#可以用来作为if用法的参考 detectfile_name() { if [ ! -f file_name ] then echo "Error: file_name does not exist. Please check" exit 1; else echo "OK,the directy is exist" fi }
linux常用命令
关于文件/目录处理的指令:
1. ls
这是最基本的文件指令。 ls 的意义为 "list",也就是将某一个目录或是某一个文件的内容显示出来。
如果你在下 ls 指令后面没有跟任何的文件名,它将会显示出目前目录中所有文件。
也可以在 ls 后面加上所要察看的目录名称或文件的名称,如:
% ls /home2/X11R5
% ls first
ls 有一些特别的参数,可以给予使用者更多有关的信息,如下:
-a : 在 UNIX 中若一个目录或文件名字的第一个字符为 "." , 则使用 ls
将不会显示出这个文件的名字,我们称此类文件为隐藏文件。如果我们要察看这类文件,则必须加上参数 -a 。
-l : 这个参数代表使用 ls 的长( long )格式,可以显示更多的信息,如文件存取权,文件拥有者( owner ),文件大小,文件最后更新日期,甚而 symbolic link 的文件是 link 到那一个文件等等。例如:
% ls -l
drwx--x--x 2 jjtseng 512 Aug 8 05:08 18
drwx--x--x 2 jjtseng 512 Aug 8 22:00 19
-rw------- 1 jjtseng 566 Aug 8 05:28 makefile
2. cp
cp 这个指令的意义是复制("COPY") , 也就是将一个或多个文件复制成另一个文件或者是将其复制到另一个目录去。
cp 的用法如下:
cp f1 f2 : 将文件名为 f1 的文件复制一份为文件名为 f2 的文件。
cp f1 f2 f3 ... dir : 将文件 f1 f2 f3 ... 都以相同的文件名复制一份放到目录 dir 里面。
cp -r dir1 dir2 : 将 dir1 的全部内容全部复制到 dir2 里面。
cp 也有一些参数,如下:
-i : 此参数是当已经有文件名为 f2 的文件时,若迳自使用 cp 将会将原来 f2的内容覆盖,因此在要覆盖之前先询问使用者。如使用者的回答是y(yes)才执行复制的动作。
-r : 此参数是用来做递回复制用,可递归的将整个目录都复制到另一个目录中。
3. mv
mv 的意义为 move , 主要是将一文件改名或移动到另一个目录。与cp类似,它也有三种格式:
mv f1 f2 : 将文件名为 f1 的文件变更成文件名为 f2 的文件。
mv dir1 dir2 : 将文件名为 dir1 的目录变更成文件名为 dir2 的目录。
mv f1 f2 f3 ... dir : 将文件 f1 f2 f3 ... 都移至目录 dir 里面。
mv 的参数有两个,-f 和 -i , 其中 -i 的意义与 cp 中的相同,均是 interactive的意思。而 -f 为强迫( force ) , 就是不管有没有同名的文件,反正就是要执行,所有其他的参数遇到 -f 均会失效。
4. rm
rm 的意义是 remove ,也就是用来删除一个文件的指令。需要注意的是,在 UNIX 中一个被删除的文件除非是系统恰好做了备份,否则是无法像 DOS 里面一样还能够恢复的。所以在做 rm 动作的时候使用者应该要特别小心。
rm 的格式如下:
rm f1 f2 f3 .....
rm 的参数比较常用的有几个: -f , -i , 与 -r
-f : 将会使得系统在删除时,不提出任何警告讯息。
-i : 在删除文件之前均会询问是否真要删除。
-r : 递归的删除,可用于删除目录。
5. mkdir
mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用 mkdir 建立一个子目录,使用的方法如下:
mkdir dirname1 [ dirname2 ... ]
8. pwd
pwd 会将当前目录的路径( path )显示出来
9. cat/more/less
以上三个指令均为察看文件内容的指令。cat 的意义是concatenate,实际就是把文件的内容显示出来的意思。
cat 有许多奇怪的参数,较常为人所使用的是 -n 参数,也就是把显示出来的内容加上行号。
cat 的用法如下:
cat [-n] :自标准输入读取内容,可以用 pipe 将别的指令的输出转向给 cat 。
cat [-n] filename : 将 filename 的内容读进来,显示在标准输出上。
问题在於 cat 它是不会停下来的,因此并不好用( 试想如果一个萤幕二十四行,而一个文件四百行,cat 一出来将会噼里啪啦不断的卷上去,使用者很难据此得到他们所需的信息。) 所以常常么使用 more 和less来帮助。
more 可以让文件根据控制台的模式一页页的显示出来,再根据使用者的要求换页或者换行。如果使用者要在某一个文件中搜寻一个特定的字符串,则按 / 然后跟着打所要搜寻的单字即可进行搜寻。
more 的使用法如下:
more filename
如果你在使用中觉得已经看到了所要看的部份,可以按'q'离开 more 的使用。
less 的用法与 more 极类似,原先它就是为了弥补 more 只能往前方卷页的缺点而设计。
Less 的用法如下:
less filename
它与 more 不同的是它可以按 y 来往上卷一行,并且可以用"?"来往回搜寻你所要找的字符。
10. chmod
chmod用来改变文件存取模式( change mode ) 。在linux中,一个文件有可读(r)可写(w)可执行(x)三种模式,分别针对该文件的拥有者( onwer )、同组用户( group member )(可以 ls -lg来观看某一文件的所属的 group ),以及其他人( other )。
一个文件如果改成可执行模式则系统就将其视为一个可执行文件,而一个目录的可执行模式代表使用者有进入该目录之权利。
chmod使用方式如下:
chmod [ -fR ] mode filename ...
其参数的意义如下:
-f Force. chmod 不会理会失败的动作。
-R Recurive. 会将目录下所有子目录及文件改为你所要改成的模式。
关于 Process 处理的指令:
1. ps
ps 是用来显示目前你的 process 或系统 processes 的状况。
其选项说明如下:
-a 列出包括其他 users 的 process 状况。
-u 显示 user - oriented 的 process 状况 。
-x 显示包括没有 terminal 控制的 process 状况 。
-w 使用较宽的显示模式来显示 process 状况 。
我们可以经由 ps 取得目前 processes 的状况,如 pid , running state 等。
2. kill
kill 指令的用途是送一个 signal 给某一个 process 。因为大部份送的都是用来杀掉 process 的 SIGKILL 或 SIGHUP,因此称为kill 。
kill 的用法为:
kill [ -SIGNAL ] pid ...
kill -l
SIGNAL 为一个 singal 的数字,从 0 到 31 ,其中 9 是 SIGKILL ,也就是一般用来杀掉一些无法正常 terminate 的信号。
也可以用 kill -l 来察看可代替 signal 号码的数字。
关于字符串处理的指令:
1. echo
echo 是用来显示一字符串在标准输出上。echo -n 则表示当显示完之后不执行换行操作。
2. grep
grep 为一过滤器,它可自一个或多个文件中过滤出具有某个字符串的行,或是从标准输入过滤出具有某个字符串的行。
grep的用法如下:
grep [-nv] match_pattern file1 file2 ....
-n 把所找到的行在行前加上行号列出
-v 把不包含 match_pattern 的行列出
match_pattern 所要搜寻的字符串
-f 以 pattern_file 存放所要搜寻的字符串
联机查询的指令:
1. man
man 是手册 ( manual ) 的意思。 UNIX 提供线上辅助( on-line help )的功能,man 就是用来让使用者在使用时查询指令、系统调用、标准库函数、各种表格等的使用所用的。
man 的用法如下:
man [-M path] [[section] title ] .....
man [-M path] -k keyword ...
-M path man 所需要的 manual database 的路径。我们也可以用设定环境变数 MANPATH 的方式来取代 -M 选项。
title 这是所要查询的目标。
section 用一个数字表示 manual 的分类,通常 1 代表可执行指令,2 代表系统调用( system call ) ,3 代表标准库函数,等等。
man 在 UNIX 上是一项非常重要的指令,我们在这里所描述的用法仅仅只是一个大家比较常用的用法以及简单的说明,真正详细的用法与说明还是要通过使用 man 来得到。
2. who
who 指令是用来查询目前有那些人在线上。
3. info
info的查询与man类似。
网络运用指令:
1. telnet
telnet 是一个提供 user 通过网络连到 remote host。
telnet 的 格式如下:
telnet [ hostname | ip-address ] [ port ]
hostname 为一个像 ccsun1 或是 ccsun1.cc.nctu.edu.tw 的 name address,ip-address 则为一个由四个小于 255 的数字组成的 ip address ,
2. ftp
ftp 的意义是 File Transfer Program ,是一个很常用的在网路文件传输的软件。
ftp 的格式如下:
ftp [ hostname | ip-address ]
其中 hostname | ip-address 的意义跟 telnet 中的相同。
在进入 ftp 之后,如果与 remote host 连接上了,它将会询问你 username 与密码,如果输入对了就可以开始进行文件传输。
在 ftp 中有许多的命令,这里仅列出较常用的 cd , lcd , mkdir , put , mput , get , mget , binary , ascii , prompt , help 与 quit 的使用方式。
ascii 将传输模式设为 ascii 模式。通常用於传送文字文件。
binary 将传输模式设为 binary 模式,通常用于传送执行文件,压缩文件与影像文件等。
cd remote-directory 将 remote host 上的工作目录改变。
lcd [ directory ] 更改 local host 的工作目录。
ls [ remote-directory ] [ local-file ] 列出 remote host 上的文件。
get remote-file [ local-file ] 取得登陆机的文件。
mget remote-files 可使用通用字符一次取得多个文件。
put local-file [ remote-file] 将 local host 的文件送到 remote host。
mput local-files 可使用通用字符一次将多个文件放到 remote host 上。
help [ command ] 线上辅助指令。
mkdir directory-name 在 remote host 新建一个目录。
prompt 更改交谈模式,若为 on 则在 mput 与 mget 时每做一个文件传输时均会询问。
Exit/quit离开ftp
3.rlogin命令
rlogin 是“remote login”(远程登录)的缩写。该命令与telnet命令很相似,允许用户启动远程系统上的交互命令会话。
rlogin 的一般格式是:
rlogin [ -8EKLdx ] [ -e char ] [-k realm ] [ - l username ] host
一般最常用的格式是:
rlogin host
该命令中各选项的含义为:
-8 此选项始终允许8位输入数据通道。该选项允许发送格式化的ANSI字符和其他的特殊代码。如果不用这个选项,除非远端的终止和启动字符不是或,否则就去掉奇偶校验位。
-E 停止把任何字符当作转义字符。当和-8选项一起使用时,它提供一个完全的透明连接。
-K 关闭所有的Kerberos确认。只有与使用Kerberos 确认协议的主机连接时才使用这个选项。
-L 允许rlogin会话在litout模式中运行。要了解更多信息,请查阅tty联机帮助。
-d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多信息,请查阅setsockopt的联机帮助。
-e 为rlogin会话设置转义字符,默认的转义字符是“~”,用户可以指定一个文字字符或一个\\nnn形式的八进制数。
-k 请求rlogin获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_realmofhost(3)确定的远程主机区域内的远程主机的Kerberos 许可。
-x 为所有通过rlogin会话传送的数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。
4.rsh命令
rsh是“remote shell”(远程 shell)的缩写。 该命令在指定的远程主机上启动一个shell并执行用户在rsh命令行中指定的命令。如果用户没有给出要执行的命令,rsh就用rlogin命令使用户登录到远程机上。
rsh命令的一般格式是:
rsh [-Kdnx] [-k realm] [-l username] host [command]
一般常用的格式是:
rsh host [command ]
command可以是从shell提示符下键人的任何Linux命令。
rsh命令中各选项的含义如下:
-K 关闭所有的Kerbero确认。该选项只在与使用Kerbero确认的主机连接时才使用。
-d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多的信息,请查阅setsockopt的联机帮助。
-k 请求rsh获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-l 缺省情况下,远程用户名与本地用户名相同。本选项允许指定远程用户名,如果指定了远程用户名,则使用Kerberos 确认,与在rlogin命令中一样。
-n 重定向来自特殊设备/dev/null的输入。
-x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。
Linux把标准输入放入rsh命令中,并把它拷贝到要远程执行的命令的标准输入中。它把远程命令的标准输出拷贝到rsh的标准输出中。它还把远程标准错误拷贝到本地标准错误文件中。任何退出、中止和中断信号都被送到远程命令中。当远程命令终止了,rsh也就终止了。
5.rcp命令
rcp代表“remote file copy”(远程文件拷贝)。该命令用于在计算机之间拷贝文件。
rcp命令有两种格式。第一种格式用于文件到文件的拷贝;第二种格式用于把文件或目录拷贝到另一个目录中。
rcp命令的一般格式是:
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file
directory 每个文件或目录参数既可以是远程文件名也可以是本地文件名。远程文件名具有如下形式:rname@rhost:path,其中rname是远程用户名,rhost是远程计算机名,path是这个文件的路径。
rcp命令的各选项含义如下:
-r 递归地把源目录中的所有内容拷贝到目的目录中。要使用这个选项,目的必须是一个目录。
-p 试图保留源文件的修改时间和模式,忽略umask。
-k 请求rcp获得在指定区域内的远程主机的Kerberos 许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。 如果在文件名中指定的路径不是完整的路径名,那么这个路径被解释为相对远程机上同名用户的主目录。如果没有给出远程用户名,就使用当前用户名。如果远程机上的路径包含特殊shell字符,需要用反斜线(\\)、双引号(”)或单引号(’)括起来,使所有的shell元字符都能被远程地解释。 需要说明的是,rcp不提示输入口令,它通过rsh命令来执行拷贝。
Vi常用技巧
取消命令
在vi中,只要没有把修改结果存入磁盘文件中,那么就可以通过“取消”来撤销最近的操作或对缓冲区的修改。
假设你无意删除了一行文本、改变了一些你不应该改变的内容或增加了一些不正确的文本,可以按<Esc>改变到命令模式中,然后按<u>,则文件内容恢复到修改前的样子。
保存到文件名为filename的文件中
发出写命令格式: :w filename
不使用小键盘来定位光标
vi用<h>、<j>、<k>、<l>键来定位光标。其中<h>、<l>键表示光标的左右移动,<j>、<k>键表示光标的上下移动,在某些没有或不能使用小键盘的情况下这四个键是很有用的。
下面是其他一些用于移动光标的键:
按空格键或<l>向右移动光标一个位置 按<Return>将光标移动到下一行的行首 使用<j>键将光标移动到下一行的当前位置或行末 按<->将光标移动到上一行行首 使用<k>键将光标移动到上一行的当前位置或行末 按<h>将光标向左移动一个字符 按<0>(零)将光标移动到一行的行首 按<$>将光标移动到一行的行末
大范围移动键
可快速定位光标到屏幕的顶部、中部和底部:
按<Shift-h>将光标移到屏幕的第一行,有时称为home位置 按<Shift-m>将光标移到现在屏幕显示的各行的中间一行 按<Shift-l>将光标移到屏幕的最后一行 按<Ctrl-f>向前移动一屏 按<Ctrl-b>向后移动一屏 要移动到缓冲区中指定的行中,在按<Shift-g>前键入行号(注意,这里的行号不是当前屏幕中的相对行号,而是绝对行号)
删除文本
<x>删除光标处的字符 <d> <w> 删除从当前字的光标处到下一个字的开始处之间的内容 <d> <$> 删除从光标处到行尾之间的内容 <Shift-d> 同<d> <$>,删除当前行的剩余部分 <d> <d> 删除整行,不管光标在该行的位置 通过在上述命令之前键入一个整数,可将这些命令应用到几个对象中,例如:<4> <x>删除4个字符;<8> <d> <d> 删除8行
添加文本
使用<i>在光标位置前插入文本 使用<Shift-i>使你进入输入模式并且在当前行行首插入文本 使用<a>在光标位置后插入文本 使用<Shift-a>使你进入输入模式并且在当前行末尾插入文本 使用<o>在当前行的下面打开一行以添加文本 使用<Shift-o>在当前行的上面打开一行以添加文本
使vi显示行号
按<Esc>键以确保你在命令模式中,然后输入:se number。要关闭行号,输入:se nonumber
查找
/string 在缓冲区中向前查找字符串string ?string 在缓冲区中向后查找字符串string <n> 以当前的方向再次查找 <Shift-n>以相反的方向再次查找 注意,查找的字符串中若含有特殊字符的,要使用\来进行转意
修改和替换文本
<r> 替换单个字符 <Shift-r>替换一个字符序列 <c> <w>修改当前字,从光标处到这个字的字尾 <c> <e>修改当前字,从光标处到这个字的字尾(与<c> <w>相同) <c> <b>修改当前字,从该字的字头到光标以前的那些字符 <c> <$>修改一行,从光标处到该行的行尾 <Shift-c>修改一行,从光标处到该行的行尾(与<c> <$>相同) <c> <c>修改整行 注意,这些命令的每个命令都使之进入了输入模式。除使用<r>来替换单个字符外,必须按<Esc>键来完成所作的修改并返回命令模式 要修改几个字,在按<c> <w>之前使用一个整数
拷贝、剪切和粘贴
<y> <w>拷贝从当前字的光标处到下一个字的开始处之间的内容 <y> <$>拷贝从光标处到行尾之间的内容 <Shift-y>拷贝当前行的剩余部分(与<y> <$>相同) <y> <y>拷贝整个当前行 通过在这些命令前键入整数,所有这些命令都可以用于多个对象。 当删除或剪切或拷贝时,删除或拷贝的对象被保存在通用缓冲区中,可以使用<p>或<Shift-p>命令将这个缓冲区中的内容粘贴到光标位置。 <p>命令将对象粘贴到光标位置右边或光标位置后面 <Shift-p>命令将对象粘贴到光标位置左边或光标位置前面
重复命令
可以按< . >来重复改变缓冲区的最后一个命令。