LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 663|回复: 0

shell学习

[复制链接]
发表于 2007-1-12 20:58:44 | 显示全部楼层 |阅读模式
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: '{...}'
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表