FreeBSD Shell的高级功能(转)[@more@]由于 shell是Unix下用户最经常使用的界面,因此熟练掌握必然带来更高的工作效率。事实上,仍然有很多种技巧,能帮助用户更方便的使用shell。
1) 命令行使用技巧
一个重要的增强功能是 shell提供的命令行编辑功能,这包括能够使用上次执行过的指令(命令回溯),对已经输入的部分进行编辑等等。
注意: shell的这些增强功能是在最新版本(4.2之后)的系统中才加以添加的,因此不再需要额外安装tcsh或bash。新版的FreeBSD使用tcsh作为基本的csh,而sh的功能也得到了增强。如果是老版本的系统,则需要安装tcsh作为shell,或者安装bash,来获得这些增强功能。
然而,最新的 sh缺省情况下并没有打开这个功能,因此必须首先打开这个功能,当打开这个功能之后,就能使用方向键来回溯执行过的命令,并进行修改。
$ set -o emacs
$ set -o vi
按照习惯的不同,可以选择 vi风格的编辑方式或emacs风格的方式,而vi风格还能支持vi的键盘指令,即在按下Esc键之后,使用h、j、k、l四个键来移动光标和回溯命令,它的好处是不使用基本键盘之外的控制键,因而可以适用于任何终端设备,并且进行编辑时手不需离开基本键盘,熟练操作之后最为快捷。
最新版本的 csh,即tcsh,缺省就支持命令回溯,但也能使用不同的命令切换编辑风格:
% bind emacs
% bind vi
另一个重要的功能是可以为常用的命令设置别名,简化用户输入,例如:
$ alias ec= “ echo This is a alias ”
$ ec
This is a alias
csh用于方便用户操作的另一项能力是自动补全命令或文件名的功能,因为FreeBSD下的文件名可能很长,将它们全部输入比较麻烦。事实上可以输入部分名字,然后按Tab键(在vi风格下是连续两次按Esc键),shell将自动补全文件名的剩余部分。如果已经输入的这部分名字不能确定具体的命令或文件,那么shell只将能确定的部分补上,然后响铃通知使用者继续输入以明确具体的文件。
事实上即使在基本的 sh或csh下,也可以使用 “ * ” 等特殊字符,用模式匹配的方式来简化输入。
$ cd /usr/loca*
$ pwd
/usr/local
Unix中的多数程序都具备模式匹配的处理能力,而shell的模式匹配功能最为常用。shell可以使用这些特殊模式来配置多个文件,达到简化操作的目的。如果要熟练掌握Unix,必须掌握模式匹配。
2) 控制功能
Unix的shell不仅仅简单的接受输入指令并执行,它更强大的能力是能够根据条件解释执行输入指令。当然,sh和csh对于输入的解释语法有所不同,由于在系统中sh最为基本,以下以sh为例,简单介绍shell的控制功能。
最重要的功能之一是根据条件来判断是否需要完成某项工作。最简单的情况下,如果某个程序存在并可以执行,则执行执行这个程序,这种用法在启动脚本中十分常见。这需要使用逻辑“与”判断:
$ [ -x /usr/bin/echo ] && /usr/bin/echo “ the program echo is running! ”
the program echo is running!
与此相反的方式是,当条件不成立的时候执行程序,这需要逻辑“或”判断:
$ [ -f /tmp/somefiles ] || echo “ somefiles is missing! ”
somefiles is missing!
当然,无论哪一种逻辑判断形式,关键点是逻辑判断本身的语法。一般来讲,可以根据文件本身的属性进行判断,如上面例子中判断文件 ” -f ” 是否存在, ” -x ” 判断文件是否是执行程序,还可以判断是否为目录 ” -d ” ,等等。此外,还可以根据字符串来进行判断,判断两个字符串是否相同、甚至比较大小,以及进行数学判断等等,下面将在介绍其他控制方式时给出一些例子。
更详细的判断条件,可以 man test。事实上,判断语句中的括号[本身就是一个程序,就是test,这个程序根据后面的条件返回一定的结果。因此,完全可以直接根据一个程序的返回结果进行判断。
使用逻辑与和逻辑或进行逻辑判断,是逻辑判断的一种缩略形式,它的好处是能将几个命令放在一行中。更为标准的方法当然还是使用 if判断语句。
$ if [ -d /home/user ] ; then echo “ user directory is exist! ” fi
user directory is exist!
此时由于有控制部分,将所有语句都写在一行上显然不是好主意, sh允许将这样一个语句分开完成的机制。
$ if [ ! -d /home/user1 ]
> then
> echo “ user1 directory is not exist! ”
> fi
注意, ” > “ 为 shell的提示符号而不是语句本身,当语句还没有完成的时候,sh使用提示符 ” > “ ,而不是标准的 ” $ ” ,这个提示符是由环境变量 PS2决定的。这个语句中增加了逻辑非的判断。
除了根据文件的属性进行判断之后,更多的情况下需要判断字符串是否相同:
1) 命令行使用技巧
一个重要的增强功能是 shell提供的命令行编辑功能,这包括能够使用上次执行过的指令(命令回溯),对已经输入的部分进行编辑等等。
注意: shell的这些增强功能是在最新版本(4.2之后)的系统中才加以添加的,因此不再需要额外安装tcsh或bash。新版的FreeBSD使用tcsh作为基本的csh,而sh的功能也得到了增强。如果是老版本的系统,则需要安装tcsh作为shell,或者安装bash,来获得这些增强功能。
然而,最新的 sh缺省情况下并没有打开这个功能,因此必须首先打开这个功能,当打开这个功能之后,就能使用方向键来回溯执行过的命令,并进行修改。
$ set -o emacs
$ set -o vi
按照习惯的不同,可以选择 vi风格的编辑方式或emacs风格的方式,而vi风格还能支持vi的键盘指令,即在按下Esc键之后,使用h、j、k、l四个键来移动光标和回溯命令,它的好处是不使用基本键盘之外的控制键,因而可以适用于任何终端设备,并且进行编辑时手不需离开基本键盘,熟练操作之后最为快捷。
最新版本的 csh,即tcsh,缺省就支持命令回溯,但也能使用不同的命令切换编辑风格:
% bind emacs
% bind vi
另一个重要的功能是可以为常用的命令设置别名,简化用户输入,例如:
$ alias ec= “ echo This is a alias ”
$ ec
This is a alias
csh用于方便用户操作的另一项能力是自动补全命令或文件名的功能,因为FreeBSD下的文件名可能很长,将它们全部输入比较麻烦。事实上可以输入部分名字,然后按Tab键(在vi风格下是连续两次按Esc键),shell将自动补全文件名的剩余部分。如果已经输入的这部分名字不能确定具体的命令或文件,那么shell只将能确定的部分补上,然后响铃通知使用者继续输入以明确具体的文件。
事实上即使在基本的 sh或csh下,也可以使用 “ * ” 等特殊字符,用模式匹配的方式来简化输入。
$ cd /usr/loca*
$ pwd
/usr/local
Unix中的多数程序都具备模式匹配的处理能力,而shell的模式匹配功能最为常用。shell可以使用这些特殊模式来配置多个文件,达到简化操作的目的。如果要熟练掌握Unix,必须掌握模式匹配。
2) 控制功能
Unix的shell不仅仅简单的接受输入指令并执行,它更强大的能力是能够根据条件解释执行输入指令。当然,sh和csh对于输入的解释语法有所不同,由于在系统中sh最为基本,以下以sh为例,简单介绍shell的控制功能。
最重要的功能之一是根据条件来判断是否需要完成某项工作。最简单的情况下,如果某个程序存在并可以执行,则执行执行这个程序,这种用法在启动脚本中十分常见。这需要使用逻辑“与”判断:
$ [ -x /usr/bin/echo ] && /usr/bin/echo “ the program echo is running! ”
the program echo is running!
与此相反的方式是,当条件不成立的时候执行程序,这需要逻辑“或”判断:
$ [ -f /tmp/somefiles ] || echo “ somefiles is missing! ”
somefiles is missing!
当然,无论哪一种逻辑判断形式,关键点是逻辑判断本身的语法。一般来讲,可以根据文件本身的属性进行判断,如上面例子中判断文件 ” -f ” 是否存在, ” -x ” 判断文件是否是执行程序,还可以判断是否为目录 ” -d ” ,等等。此外,还可以根据字符串来进行判断,判断两个字符串是否相同、甚至比较大小,以及进行数学判断等等,下面将在介绍其他控制方式时给出一些例子。
更详细的判断条件,可以 man test。事实上,判断语句中的括号[本身就是一个程序,就是test,这个程序根据后面的条件返回一定的结果。因此,完全可以直接根据一个程序的返回结果进行判断。
使用逻辑与和逻辑或进行逻辑判断,是逻辑判断的一种缩略形式,它的好处是能将几个命令放在一行中。更为标准的方法当然还是使用 if判断语句。
$ if [ -d /home/user ] ; then echo “ user directory is exist! ” fi
user directory is exist!
此时由于有控制部分,将所有语句都写在一行上显然不是好主意, sh允许将这样一个语句分开完成的机制。
$ if [ ! -d /home/user1 ]
> then
> echo “ user1 directory is not exist! ”
> fi
注意, ” > “ 为 shell的提示符号而不是语句本身,当语句还没有完成的时候,sh使用提示符 ” > “ ,而不是标准的 ” $ ” ,这个提示符是由环境变量 PS2决定的。这个语句中增加了逻辑非的判断。
除了根据文件的属性进行判断之后,更多的情况下需要判断字符串是否相同:
QUOTE: 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617542/viewspace-946419/,如需转载,请注明出处,否则将追究法律责任。
上一篇:
Linux下使用icq(转)
下一篇:
SCO UNIX作业调度(转)
![]()
请登录后发表评论
登录
全部评论
<%=items[i].createtime%>
<%=items[i].content%> <%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%}%> <%}%>
<%=items[i].items.items[j].createtime%>
<%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
还有<%=items[i].items.total-5%>条评论
) data-count=1 data-flag=true>点击查看
<%}%>
|
转载于:http://blog.itpub.net/10617542/viewspace-946419/