|
1.为了使man命令正常工作,我们必须提供给SHELL帮助手册所放的位置.
这条信息是由MANPATH来指定的,一条常用的设置是:
MANPATH=/usr/man:/usr/share/man
2.ls -F,列出的目录后面有/,ls -d强迫ls只显示目录的名字,不显示目录的内容
3.rm -r删除目录及其下面的内容
4.echo "test\c"中\表示后面不默认跟随换行,一些版本的ECHO不支持这个转义.
5.cmd<<delimiter
在这里,shell将操作符<<解释为如下命令:shell读取用户输入,直到遇到某一行,
其中包括指定的delimiter.
6.cmd 1>file1 2>file2
命令cmd的标准输出被重定向到文件file1,标准错误被重定向到文件file2,通常标
准输出的文件描述符1是被省略的,因为命令可以简化为cmd >file1 2>file2
cmd >file 2>&
STDOUT与STDERR被重定向到指定的文件file
如rm test>/dev/null 2>&1输出与错误信息都清空
重定向两个文件描述符:
n>&m 在这里,n和m都是文件描述符,当n=1 m=2时,STDOUT被重定向到STDERR(原书
上相反,我估计书错了).输出重定向的普通格式经常和exec命令结合起来复制一个已经
打开的输出文件描述符.
exec n>&m 在这里,n是一个新文件描述符,而m是一个已经打开的输出文件描述符,
例如: exec 4>out.txt,接着执行exec 5>&4
会导致文件描述符5成为文件描述符4的复制品, date 1>&5,将在文件out.txt里结束
输入重定向的通用格式和输出重定向的通用格式相似:
n<&m
关闭文件描述符: exec n>-,比如exec 4>-将关闭以前打开的文件描述符4
7./dev/null是UNIX系统中被用来丢弃输出信息的特殊文件,如果你将一条命令的输出
重定向到/dev/null,那么输出将被丢弃.例如命令rm file>/dev/null,将丢弃rm命令
的输出信息,如果你用cat命令显示/dev/null文件的内容到一个文件,该文件的内容将
被清除.如cat /dev/null >file.执行命令后,文件file存在,但其大小变成0
SHELL编程:
1.ksh命令 set -A band derri terry mike gene相当于
band[0]=derri band[1]=terry band[2]=mike band[3]=gene
2.test 字符串
test -z str (当str长度为0时返回真)
test -n str (当str长度非0时返回真)
test -z str与[-z str]都是检测字符串是否为空
if [-z "$APPLE"];then echo "$APPLE is empty"
注意$APPLE必须用双引号引起来,否则会报错:test:argument expected
如果没有引号,就相当于[-z ],缺少参数,所以会报错.
if [-n "$APPLE"];then echo "$APPLE is not empty"
3.$? 上一条命令的退出状态保存在变量$?中,因此你可以用该变量来检测一条命令是否成功
if [$? -eq 0];then echo "Command was successful"
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数
$# 这个程式的参数个数
$$ 这个程式的PID
$! 执行上一个背景指令的PID
$? 执行上一个指令的返回值
$@ 所有的参数都被独立的引用.如果一个脚本接收到两个参数,$@等价于$1 $2
当你执行这个程式时的参数数目超过9 个时,我们可以使用shift 命令将
参数往前移一格,如此即可使用第10个以後的参数。除此之外,吾人可以用
set 命令改变$n及$*,方法如下:
set string
如此$*的值即为string,而分解後则会放入$n。如果set 命令後面没有参
数,则会列出所有已经设定的变数以及其值。
档名:ex1 参数:this is a test
┌———————————┐
│echo Filename: $0 │
│echo Arguments: $* │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│shift │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│set hello, everyone │
│echo Arguments: $* │
│echo 2nd arg.: $2 │
└———————————┘
结果如下:
Filename: ex1
Arguments: this is a test
No. of args.: 4
2nd arg.: is
No. of args.: 3
2nd arg.: a
Arguments: hello, everyone
2nd arg.: everyone
4.别名:alias lsl="ls -l" ,取消别名 unalias lsl,取消函数unset lsl
5.正则表达式:
. 可代替除一行之外的任何单个字符
* 可代替除零个或多个在它前面出现的字符
^ 匹配一行的开头
$ 匹配一行的结尾
\ 转义
[^T]也表示否定操作符,表示除T字母外的.
一些有用的正则表达式:
空白行 /^$/ 一整行 /^.$/
一个或多个空格 /*/
6.sed: sed命令的形式: sed '/pattern/action' files
action的操作包括: p打印行 d 删除行 s用一个表达式替换别外一个 -n正确输出
即使文件输出是正确的,文件仍需要去更新.(我的理解是sed 只得到一个输出值,而原
文件并没有更新)
7.awk 'script' files
比较操作符:value~/pattern/ 如果value匹配样式,则为真
value!~/pattern/ 如果value不匹配样式,则为真
$0被awk使用,就像读取一样存储整行.
awk中的内部变量:
FILENAME 当前输入文件的名称,不能改变这个变量的值
NR 当前输入文件的行数或者输入文件的记录,不能改变这个变量的值
NF 当前行或者记录的字段数,不能改变这个变量的值
OFS 输出字段的间隔符(默认是空格)
FS 输入字段的间隔符(默认是空格和制表符,就是"\t",一个空格后面再跟着一制表符)
OFMT 数字的输出格式(默认是%.6g)
ORS 输出记录分隔符(默认是新起一行)
RS 输入记录分隔符(默认是新起一行)
手工地把FS设定为任何其他字符来改变awk分隔输入行.通常,当你看到/etc/passwd这样的系统
数据库的时候.有两个有效的方法来改变FS
BEGIN {FS=":" ;}
下面是等价的 awk -F: '{...}' |
|