会员登陆  支付方式  联系我们  在线客服  网站地图       
首页 关于域浪 互联网数据中心业务、主机托管、主机租用、机架租用、带宽租用、机房介绍、机房对比、CCN网络加速 adsl专线、深圳adsl专线 虚拟主机、域名注册、数据库、企业邮局、动态域名 网络安全、网络临近平台、安全服务、防火去墙租用、安全产品、域浪抗DDOS防火墙、NetScreen防火墙 技术支持  
   当前位置:首页 >> 技术支持 >> SHELL技巧 >> shell基础:输入和输出(echo,read,cat,管道,tee,重定向等)
 
精华文章
    AIX shell工具集  
    I/O重定向 详解及例子  
    Shell 编程实例集锦  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux下Shell基础知识...  
    Linux Shell 下的输出...  
    几个shell程序设计小知...  
    几种常见shell简介  
    shell基础十二篇  
    Shell编程基础  
    Bourne Shell及shell编...  
    shell命令(三)  
    shell命令(二)  
    shell命令(一)  
    shell基础:输入和输出...  
    shell命令  
    shell编程入门及脚本测...  
    Linux Shells简介  
    TCSH Shell编程  
    Korn Shell编程  
    Shell基础及编程(二)  
    Shell基础及编程(一)  
    shell基础知识  
    shell编程例子 -- 一个...  
    在LinuxShell程序中进...  
    SHELL病毒简介  
  更多>>  
   SHELL技巧
 shell基础:输入和输出(echo,read,cat,管道,tee,重定向等)
    在看这个之前,像俺这样没有基础的,得先看完网中人的《shell十三问》的前三章,在置顶处,所以前面echo的含义,参数,及基础用法等就不说了。

[b:99ca6b8995]我下面的所有环境都在在REDHAT LINUX9下试验的

在LINUX中,要使转义符生效,需加参数-e[/b:99ca6b8995]



从echo的变量开始说起

[b:99ca6b8995]如:e c h o命令输出转义符以及变量。[/b:99ca6b8995]



[code:1:99ca6b8995]# echo -e "\007your home is $HOME , you are connected on `tty`"

your home is /root , you are connected on /dev/pts/1

# echo -e "\ayour home is $HOME , you are connected on `tty`"

your home is /root , you are connected on /dev/pts/1

#[/code:1:99ca6b8995]

[quote:99ca6b8995]本例中

\007或\a你可以让终端铃响一声

显示出$ H O M E目录,

并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号 )。[/quote:99ca6b8995]



[b:99ca6b8995]在e c h o命令输出之后附加换行,可以使用\ n选项:[/b:99ca6b8995]



[code:1:99ca6b8995]$ cat echod

#!/bin/sh

echo -e "this echo's 3 new lines\n\n\n"

echo "OK"[/code:1:99ca6b8995]

编辑一个新echod,如上内容,然后运行输出如下:

[code:1:99ca6b8995]$ ./echod

this echo's 3 new lines 

 

OK

$[/code:1:99ca6b8995]



[b:99ca6b8995]在e c h o语句中使用跳格符,记住别忘了加反斜杠\:[/b:99ca6b8995]



[code:1:99ca6b8995]$ echo -e "here is a tab\there are two tabs\t\tok"

here is a tab   here are two tabs               ok

$[/code:1:99ca6b8995]



[b:99ca6b8995]把一个字符串输出到文件中,使用重定向符号>。

在下面的例子中一个字符串被重定向到一个名为m y f i l e的文件中:[/b:99ca6b8995]



[code:1:99ca6b8995]$ echo "The log files have all been done"> myfile[/code:1:99ca6b8995]



[b:99ca6b8995]或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:[/b:99ca6b8995]

[code:1:99ca6b8995]$ echo "$LOGNAME carried them out at `date`">>myfile[/code:1:99ca6b8995]



[b:99ca6b8995]现在让我们看一下m y f i l e文件中的内容:[/b:99ca6b8995]

[quote:99ca6b8995]The log files have all been done

sam carried them out at 六 11月 13 12:54:32 CST 2004[/quote:99ca6b8995]



[b:99ca6b8995]引号是一个特殊字符,所以必须要使用反斜杠\来使s h e l l忽略它的特殊含义。[/b:99ca6b8995]

假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠\即可:

[code:1:99ca6b8995]$ echo "\"/dev/rmt0"\"

"/dev/rmt0"

$[/code:1:99ca6b8995]



其它用法:

--〉'echo'用法收集:) 

http://bbs.chinaunix.net/forum/viewtopic.php?t=424904



ANSI控制码 

http://bbs.chinaunix.net/forum/viewtopic.php?t=207837&highlight=%B7%C9%BB%D2%B3%C8



 寂寞烈火 回复于:2004-11-13 15:12:44 

支持!!!

P.S:read的用法,r2007班主的精华贴里有 ;)

 

 wingger 回复于:2004-11-13 15:46:21 

[quote:3773eb31f2="寂寞烈火"]支持!!!

P.S:read的用法,r2007班主的精华贴里有 ;)[/quote:3773eb31f2]

r2007的贴子在这里:

http://bbs.chinaunix.net/forum/viewtopic.php?t=237464



其它:可以自己练习

[code:1:3773eb31f2][sam@chenwy sam]$ read name

sam

[sam@chenwy sam]$ echo $name

sam

[sam@chenwy sam]$ read name surname

sam ch

[sam@chenwy sam]$ echo $name surname

sam surname

[sam@chenwy sam]$ read name surname

sam ch yiir

[sam@chenwy sam]$ echo $name

sam

[sam@chenwy sam]$ echo $surname

ch yiir[/code:1:3773eb31f2]



[code:1:3773eb31f2][sam@chenwy sam]$ cat var_test

#!/bin/sh

#var_test

echo -e "First Name :\c"

read name

echo -e "Middle Name :\c"

read middle

echo -e "Last name :\c"

read surname[/code:1:3773eb31f2]

var_test文件内容如上



[code:1:3773eb31f2][sam@chenwy sam]$ ./var_test

First Name :wing

Middle Name :er

Last Name:chenwy[/code:1:3773eb31f2]



运行var_test文件



请问上面是不是把三个值赋给name,middle,surname三个变量了???



用read可以倒着读一个文件? 

http://www.chinaunix.net/forum/viewtopic.php?t=939



[quote:8bda926050="wingger"]

我本来想不再继续了,发贴子满累的,嘿嘿

r2007的贴子在这里:



http://bbs.chinaunix.net/forum/viewtopic.php?t=237464



其它:[/quote:8bda926050]

班主,您辛苦了,我代表广大猜猜们向您致意  :em02:  :em02:  :em02:

 

 wingger 回复于:2004-11-13 15:54:12 

[quote:61e0857061="寂寞烈火"]

班主,您辛苦了,我代表广大猜猜们向您致意  :em02:  :em02:  :em02:[/quote:61e0857061]

呵呵,这些对你来说应该是小菜一碟



[quote:61e0857061][sam@chenwy sam]$ ./var_test 

First Name :wing 

Middle Name :er 

Last Name:chenwy [/quote:61e0857061]



运行var_test文件 



请问上面是不是把三个值赋给name,middle,surname三个变量了???

 

 寂寞烈火 回复于:2004-11-13 16:00:34 

1,[quote:02f31c9277]请问上面是不是把三个值赋给name,middle,surname三个变量了???[/quote:02f31c9277]

test:[quote:02f31c9277]

/home/lee#read a b c d

1 2 3 4

/home/lee#echo $a

1

/home/lee#echo $b

2

/home/lee#echo $c

3

/home/lee#echo $d

4

/home/lee#

[/quote:02f31c9277]

2,[quote:02f31c9277]

用read可以倒着读一个文件?[/quote:02f31c9277]

用现成的rev和tac就可以

P.S:

[quote:02f31c9277]

呵呵,这些对你来说应该是小菜一碟[/quote:02f31c9277]

哪里哪里,我只不过是一个fans而已,我的job跟IT一点关西都没有 :( 很多知识还得向你请教呢 ;)

 

 wingger 回复于:2004-11-13 16:03:48 

[quote:698514f05d]/home/lee#read a b c d 

1 2 3 4 

/home/lee#echo $a 



/home/lee#echo $b 



/home/lee#echo $c 



/home/lee#echo $d 



/home/lee# [/quote:698514f05d]



我是说在脚本里,像我上面那个



[code:1:698514f05d][sam@chenwy sam]$ cat var_test 

#!/bin/sh 

#var_test 

echo -e "First Name :\c" 

read name 

echo -e "Middle Name :\c" 

read middle 

echo -e "Last name :\c" 

read surname[/code:1:698514f05d]



执行这个脚本里,是不是分别赋值了,俺怎么看还是空的呢?

 

 寂寞烈火 回复于:2004-11-13 16:15:11 

[quote:35a68d9131]

echo -e "First Name :\c" 

read name #var1

echo -e "Middle Name :\c" 

read middle #var2

echo -e "Last name :\c" 

read surname #var3

[/quote:35a68d9131]

这个脚本里,你用read分别给3个变量赋了值

 

 wingger 回复于:2004-11-13 16:28:47 

[quote:5f42ff30c7="寂寞烈火"]

这个脚本里,你用read分别给3个变量赋了值[/quote:5f42ff30c7]



按理是这样的,可是,echo $name $middle $surname是空的

 

 寂寞烈火 回复于:2004-11-13 16:34:58 

[quote:a08f04d972="wingger"]



按理是这样的,可是,echo $name $middle $surname是空的[/quote:a08f04d972]

不会吧

/home/lee#cat f[code:1:a08f04d972]

echo -e "First Name :\c"

read name #var1

echo -e "Middle Name :\c"

read middle #var2

echo -e "Last name :\c"

read surname #var3

echo $name $middle $surname

[/code:1:a08f04d972]

/home/lee#sh f

First Name :j

Middle Name :m

Last name :l

j m l



 wingger 回复于:2004-11-13 16:49:06 

echo $name $middle $surname 



得把这个加入脚本里 :oops:  :oops:  :oops:

 

 寂寞烈火 回复于:2004-11-13 16:55:32 

[quote:ac6e0d80e8="wingger"]echo $name $middle $surname 



得把这个加入脚本里 :oops:  :oops:  :oops:[/quote:ac6e0d80e8]

晕~~~~,麻烦你看仔细点呀  :em08:  :em08:

 

 wingger 回复于:2004-11-13 17:10:26 

呵呵,我明白了



[quote:e68ae1198b]/home/lee#read a b c d 

1 2 3 4 

/home/lee#echo $a 



/home/lee#echo $b 



/home/lee#echo $c 



/home/lee#echo $d 

4 [/quote:e68ae1198b]



不好意思,我理解有错,我原来以为可以有这样的结果

 

 wingger 回复于:2004-11-13 20:17:37 

[b:cca1eec133]cat:显示文件内容,创建文件,还可以用它来显示控制字符。[/b:cca1eec133]



注意:在文件分页符处不会停下来;会一下显示完整个文件。因此,可以使用m o r e命令或把c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,使用命令less file可实现相同的功能。



如下形式

[code:1:cca1eec133]$ cat myfile | more



$ cat myfile | pg[/code:1:cca1eec133]



c a t命令的一般形式为:



[code:1:cca1eec133]cat [options] filename1 ... filename2 ...[/code:1:cca1eec133]



1、显示名为m y f i l e的文件:



[code:1:cca1eec133]$ cat myfile[/code:1:cca1eec133]



2、显示m y f i l e 1、m y f i l e 2、m y f i l e 3这三个文件,可以用:



[code:1:cca1eec133]$ cat myfile1 myfile2 myfile3[/code:1:cca1eec133]



3、创建一个包含上述三个文件的内容,名为b i g f i l e的文件,可以用输出重定向到新文件中:



[code:1:cca1eec133]$ cat myfile1 myfile2 myfile3 > bigfile[/code:1:cca1eec133]



4、如果cat的命令行中没有参数,输入的每一行都立刻被cat命令输出到屏幕上,输入完毕后按< C T R L - D >结束



[code:1:cca1eec133]$ cat

Hello world 

Hello world  

<ctrl+d>

$[/code:1:cca1eec133]



5、新建文件



[code:1:cca1eec133]$cat >myfile

This is great

<ctrl-d>

$cat myfile

This is great[/code:1:cca1eec133]



[b:cca1eec133][color=red:cca1eec133]cat:参数选项[/color:cca1eec133][/b:cca1eec133]



使用方式:

[code:1:cca1eec133]cat [-AbeEnstTuv] [--help] [--version] fileName [/code:1:cca1eec133]

说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案) 



参数: 

[quote:cca1eec133]-n 或 --number 由 1 开始对所有输出的行数编号 

-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号 

-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 

-v 或 --show-nonprinting 显示非打印字符[/quote:cca1eec133]



例:

显示时加上行号

[code:1:cca1eec133]$cp /etc/httpd/conf/httpd /usr/sam 

$ cat -n httpd.conf [/code:1:cca1eec133]



把 httpd.conf 的内容加上行号后输入 httpd1.conf 这个文件里

[code:1:cca1eec133]$cat -n httpd.conf > httpd1.conf [/code:1:cca1eec133]



对文件httpd.conf加上行号(空白不加)后显示

[code:1:cca1eec133]$ cat -b httpd.conf [/code:1:cca1eec133]



把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。

[code:1:cca1eec133]$ cat -b textfile1 textfile2 >> textfile3[/code:1:cca1eec133] 

 

清空/etc/test.txt档案内容 

[code:1:cca1eec133]$cat /dev/null > /etc/test.txt [/code:1:cca1eec133]



使用 sed 与 cat 除去空白行 

[code:1:cca1eec133]$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d' [/code:1:cca1eec133]  



-s项我试了一下,不成功,不知是不是用错了



[b:cca1eec133]其它参数来自:[/b:cca1eec133](这个我没试)

http://bbs.chinaunix.net/forum/viewtopic.php?t=438463&highlight=cat



cat 还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。您可以用以下选项来显示制表符: 



[quote:cca1eec133]* -T 将制表符显示为 ^I 



* -v 显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。例如,当您处理一个在 Windows 系统中生成的文件时,这个文件将使用 Control-M(^M)来标记行的结束。对于代码大于 127 的字符,它们的前面将会被加上 M-(表示“meta”),这与其它系统中在字符前面加上 Alt- 相当。 



* -E 在每一行的结束处添加美元符($)。 [/quote:cca1eec133]



显示非打印字符 



[code:1:cca1eec133]$ cat -t /etc/X11/XF86Config 

... 

# Multiple FontPath entries are allowed (they are concatenated together) 

# By default, Red Hat 6.0 and later now use a font server independent of 

# the X server to render fonts. 

^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType" 

^IFontPath^I"unix/:7100" 

EndSection 

... [/code:1:cca1eec133]



[code:1:cca1eec133]$ cat -E /etc/X11/XF86Config 

... 

# Multiple FontPath entries are allowed (they are concatenated together)$ 

# By default, Red Hat 6.0 and later now use a font server independent of$ 

# the X server to render fonts.$ 



FontPath "/usr/X11R6/lib/X11/fonts/TrueType"$ 

FontPath "unix/:7100"$ 



EndSection$ 

... [/code:1:cca1eec133]



[code:1:cca1eec133]$ cat -v /etc/X11/XF86Config 

... 

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@ 

P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@ 

@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@ 

M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@ 

F^@^@ ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^? 

^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G 

...[/code:1:cca1eec133]

 

 寂寞烈火 回复于:2004-11-13 21:09:06 

cat我常用:

cat file

cat -A file

别的基本不用 ;)

 

 wingger 回复于:2004-11-13 22:11:59 

[quote:c69c154af2="寂寞烈火"]cat我常用:

cat file

cat -A file

别的基本不用 ;)[/quote:c69c154af2]



cat -n 应该还可以吧



[b:c69c154af2]tee:读取标准输入的数据,并将其内容输出成文件。[/b:c69c154af2] 



  语   法:tee [-ai][--help][--version][文件…] 

  补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。 



  参   数:-a 附加到既有文件的面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数,数据会新增在该文件内容的最面,而不会删除原先之内容。 

       -i 忽略中断信号 

       --help 在线帮助 

       --version 显示版本信息 



  例一: 

  列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3: 

  [code:1:c69c154af2]$ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3[/code:1:c69c154af2]



  例一: 把列出当前目录,并把结果结到myfile里

  [code:1:c69c154af2]$ls -l |tee myfile[/code:1:c69c154af2]



[b:c69c154af2]管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:[/b:c69c154af2]



[code:1:c69c154af2]命令1 |命令2

其中|是管道符号。[/code:1:c69c154af2]

上例就是



 whtlly 回复于:2004-11-13 22:59:49 

[quote:880887e650="wingger"]



不好意思,我理解有错,我原来以为可以有这样的结果[/quote:880887e650]

你向下面这样运行就可以了

[quote:880887e650][root@lfs tmp]# . ./3.sh

First Name :a

Middle Name :b

Last name :c

[root@lfs tmp]# echo $name $middle $surname 

a b c[/quote:880887e650]

 

 wingger 回复于:2004-11-13 23:26:41 

[quote:31191b9420="whtlly"][/quote:31191b9420]



呵呵,真的可以耶,差别在哪,俺不知道,找找资料

 

 whtlly 回复于:2004-11-13 23:34:47 

看十三问之六



 wingger 回复于:2004-11-13 23:36:08 

[quote:02699cb095="whtlly"]看十三问之六[/quote:02699cb095]



thx :lol:  :lol:  :lol:



 寂寞烈火 回复于:2004-11-13 23:40:36 

[quote:ee28dbbe8c="wingger"]



thx :lol:  :lol:  :lol:[/quote:ee28dbbe8c]

看来文革MM没有好好看我们版的"shell密笈"---shell十三问哟~

 

 wingger 回复于:2004-11-13 23:41:59 

[quote:b9635d0ac5="寂寞烈火"]

看来文革MM没有好好看我们版的"shell密笈"---shell十三问哟~[/quote:b9635d0ac5]



嗯,只看了前面一部份,明天开始看十三问 :lol:  :lol:  :lol:

 

 wingger 回复于:2004-11-14 11:36:21 

[b:112432795b]标准输入、输出和错误[/b:112432795b]



当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。

下面就是这些文件描述符及它们通常所对应的文件名:



[quote:112432795b]文件文件描述符

输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。

输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。

错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。[/quote:112432795b]

如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。



系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。



    在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。表5 - 1列出了最常用的重定向组合,并给出了相应的文件描述符。

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。



[code:1:112432795b]常用文件重定向命令

command > filename 把把标准输出重定向到一个新文件中

command >> filename 把把标准输出重定向到一个文件中(追加)

command 1 > fielname 把把标准输出重定向到一个文件中

command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中

command 2 > filename 把把标准错误重定向到一个文件中

command 2 >> filename 把把标准输出重定向到一个文件中(追加)

command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)

command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件

作为标准输出

command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入

command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符

command <&m 把把文件描述符m作为标准输入

command >&m 把把标准输出重定向到文件描述符m中

command <&- 把关闭标准输入[/code:1:112432795b]



例子:

[转载]常用文件重定向命令 (这篇网中人的回复好精彩啊^-^)

http://bbs.chinaunix.net/forum/viewtopic.php?t=191375



关于>&2、2>&1等重定向的详细解释! 

http://bbs.chinaunix.net/forum/viewtopic.php?t=16361



转贴:UNIX管道和重定向功能在系统备份中的妙用 

http://www.chinaunix.net/forum/viewtopic.php?t=17925

 

 寂寞烈火 回复于:2004-11-14 12:12:37 

受教受教!复习复习 !



 wingger 回复于:2004-11-14 14:20:42 

呵,不敢啦,俺现在是菜鸟,新手中



这个贴子俺的回复,关于其它描述符的,有没有错?

http://bbs.chinaunix.net/forum/viewtopic.php?p=2962597#2962597



 kinglegendcn 回复于:2004-11-14 17:06:19 

楼主的前几章帖子都在哪里呀,没有找到

 

 wingger 回复于:2004-11-14 17:13:00 

[quote:c657096d68="kinglegendcn"]楼主的前几章帖子都在哪里呀,没有找到[/quote:c657096d68]



你搜索一下

LINUX基础

或shell基础



第一篇

文件安全与权限 

http://bbs.chinaunix.net/forum/viewtopic.php?p=2897935#2897935

 

 寂寞烈火 回复于:2004-11-14 17:14:27 

[quote:cfe24cd1ce="kinglegendcn"]楼主的前几章帖子都在哪里呀,没有找到[/quote:cfe24cd1ce]

自己动手搜一下 ;)

http://bbs.chinaunix.net/forum/viewtopic.php?t=441883&highlight=wingger

http://bbs.chinaunix.net/forum/viewtopic.php?t=442596&highlight=wingger

http://bbs.chinaunix.net/forum/viewtopic.php?t=444209&highlight=wingger

 

 wingger 回复于:2004-11-14 17:42:47 

[b:8cd0b810d6]exec:[/b:8cd0b810d6]



e x e c命令可以用来替代当前s h e l l;换句话说,并没有启动子s h e l l。使用这一命令时任何现有环境都将会被清除,并重新启动一个s h e l l。它的一般形式为:

exec command

其中的c o m m a n d通常是一个s h e l l脚本。



我所能够想像得出的描述e x e c命令最贴切的说法就是:当这个脚本结束时,相应的会话可能就结束了。e x e c命令的一个常见用法就是在用户的. p r o f i l e最后执行时,用它来执行一些用于增强安全性的脚本。如果用户的输入无效,该

s h e l l将被关闭,然后重新回到登录提示符。e x e c还常常被用来通过文件描述符打开文件。

 e x e c在对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的s h e l l。



可以看网中人《shell十三问》第六节:

6) exec 跟 source 差在哪? 



能把十三问一次性看完最好,不过对我来说还是有些难度,今天才弄清楚第四问,看了好久才明白,目前为止,看完1,2,3,4,及11



exec:



e x e c命令可以用来替代当前s h e l l;换句话说,并没有启动子s h e l l。使用这一命令时任何现有环境都将会被清除,并重新启动一个s h e l l。它的一般形式为:

exec command



其中的c o m m a n d通常是一个s h e l l脚本。



e x e c在对文件描述符进行操作的时候,它不会覆盖你当前的s h e l l。



这章到此为止了

 

 寂寞烈火 回复于:2004-11-14 18:11:55 

source和exec的区别

1,我认为他们带的参数是不一样的

source通常是shell脚本,而exec不但可以把一个脚本当成参数,而且还可以把一个系统命令当参数,例如: exec ls

2,另外一个不同就是,exec任务执行完毕后,会执行类似logout的操作,而source执行完一个任务后返回当前的shell.

3,还有,他们的用途也不是一样的

我的理解是这样的,望指正!

 

 明月清风 回复于:2004-11-15 09:14:19 

[quote:a45425b7ba="寂寞烈火"]cat我常用:

cat file

cat -A file

别的基本不用 ;)[/quote:a45425b7ba]

cat -n file和cat -b file偶还是常用地



 wingger 回复于:2004-11-15 10:29:21 

读网中人十三问的第四问的理解:

[b:d11aca453d]1、变量一定得用""[/b:d11aca453d]

[b:d11aca453d]2、处理顺序要搞清楚:这两行一定要牢牢记在脑中[/b:d11aca453d]

[quote:d11aca453d]命令格式

command-name options argument 

处理过程:

shell 会依据 IFS(Internal Field Seperator) 将 command line 所输入的文字给拆解为"字段"(word)。 

然后再针对特殊字符(meta)先作处理,

最后再重组整行 command line 。[/quote:d11aca453d] 



[b:d11aca453d]3、例子:[/b:d11aca453d]

[b:d11aca453d]空格的好理解,但CR字符不好理解,如'',""[/b:d11aca453d]

[code:1:d11aca453d]   $ A='B 

   > C 

   > ' 

   $ echo "$A" 

   B 

   C 

   $ echo $A 

   B C [/code:1:d11aca453d]



echo 的$A加上soft quote后,得出的结果不同了,

第一个是断行字符(new line),取消了CR和IFS的功能

第二个应该是一个空格了,仅取消CR功能,而保留IFS功能

第三个是CR



[b:d11aca453d]原因如下:[/b:d11aca453d]

然而,由于 echo $A 时的变量没至于 soft quote 中,因此当变量替换完成后并作命令行重组时,<enter> 会被解释为 IFS (空格键),而不是解释为 New Line (换行符)字符。



[b:d11aca453d]而在escape中[/b:d11aca453d]

[code:1:d11aca453d]   $ A=B\ 

   > C\ 

   > 

   $ echo $A 

   BC 

   $ echo "$A "

   BC [/code:1:d11aca453d]



[b:d11aca453d]得出的结果是BC,原因:[/b:d11aca453d]

<enter> 键本身在 shell meta 中的特殊性,在 \ 跳脱后面,仅仅取消其 CR 功能,而不会保留其 IFS 功能(空格)。 因此就是(NULL)



[b:d11aca453d]因此在上面两个例子中 <enter> 键所产生的字符有四种:[/b:d11aca453d] 

[quote:d11aca453d]CR (结束命令)

IFS (空格)

NL(New Line) (断行)

NULL (空)[/quote:d11aca453d]



不知我的理解是否正确,还望各位指点,呵呵,我感觉这样说好像更容易理解 :oops:

上面理解了,下面就不难了,找个地方放一下,俺怕自己给忘了



[b:d11aca453d]而接下来的例子中,则要理解shell meta 与 command meta[/b:d11aca453d] 



有些meta ,都是有特殊用途的,比如 { } ,但在awk中 却要用 { } 来区分出 awk 的命令区段(BEGIN, MAIN, END),也就是双方都用到了{}



[b:d11aca453d]如果输入下例命令就会出错:[/b:d11aca453d] 

 

[code:1:d11aca453d]$ awk {print $0} 1.txt [/code:1:d11aca453d]



这是因为 { } 在 shell 中并没关闭,那 shell 就将 {print $0} 视为command block , 而不是awk的参数,但同时又没有" ; "符号作命令区隔,因此就出现 awk 的语法错误结果。 



[b:d11aca453d]要解决之,可用 hard quote :[/b:d11aca453d] 



[code:1:d11aca453d]$ awk '{print $0}' 1.txt [/code:1:d11aca453d]



将原本的 {、<space>、$(注三)、} 这几个 shell meta 关闭, 避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。 

( 注三:而其中的 $0 是 awk 内建的 field number ,而非 awk 的变量,awk 自身的变量无需使用 $ 。) 



要是理解了 hard quote 的功能,再来理解 soft quote 与 escape 就不难: 



[code:1:d11aca453d]awk "{print \$0}" 1.txt 

awk \{print\ \$0\} 1.txt [/code:1:d11aca453d]

第一行:由于soft quote中没法关闭$,因此用\来关闭$meta

第二行:\{关闭{,\ (\空格,关闭空格键),\$,\}就不用说了



如果awk 的 $0 的 0 值是从另一个 shell 变量读进

 

比方说:已有变量 $A 的值是 0 ,那如何在 command line 中解决 awk 的 $$A 呢? 那么 hard quoe 就不可行了: 

代码: 

[code:1:d11aca453d]$ awk '{print $$A}' 1.txt [/code:1:d11aca453d]

因为 $A 的 $ 在 hard quote 中是不能替换变量的。 



可以使用如下几种方案:

[code:1:d11aca453d]A=0 

awk "{print \$$A}" 1.txt 

awk \{print\ \$$A\} 1.txt 

awk '{print $'$A'}' 1.txt 

awk '{print $'"$A"'}' 1.txt     # 注:"$A" 包在 soft quote 中 [/code:1:d11aca453d]

上面得注意$和''和""的包含位置

 

 寂寞烈火 回复于:2004-11-15 11:47:52 

[quote:467e9bc6ae="wingger"]上面得注意$和''和""的包含位置[/quote:467e9bc6ae]

对你的学习精神所感染 8)

P.S:

[quote:467e9bc6ae]

再见清茶 

2004/11/14[/quote:467e9bc6ae]

多好的签名  :em03:  :em03:  :em03:

 

 網中人 回复于:2004-11-15 14:41:34 

[quote:5cacb49d25="wingger"]能把十三问一次性看完最好,不过对我来说还是有些难度,今天才弄清楚第四问,看了好久才明白,目前为止,看完1,2,3,4,及10以后的 

[/quote:5cacb49d25]

加油!

順便幫忙 debug 一下...  ^_^

 

 寂寞烈火 回复于:2004-11-16 02:47:27 

[quote:260feeccac="網中人"]

加油!

順便幫忙 debug 一下...  ^_^[/quote:260feeccac]

查找网兄的debug,很难的! ;)



 mymm 回复于:2004-11-16 08:27:52 

精华啊!!!



学习ing!!!



    在输入输出概念里,内联输入重定向也是个很常用的用法,在自动FTP脚本里、SHELL的生成器里,wingger可以把它再加进来,搜集的过程就是一个非常好的学习过程!!! :P 



如:

[code:1:aa88cc01b3]ftp -ni <<ENDOFSCRIPT

open 192.168.20.100

user username  pwd

bin

prom

cd /u

mput *

close

bye

ENDOFSCRIPT[/code:1:aa88cc01b3]



[code:1:aa88cc01b3]cat > mvfile.sh <<\END



for i in `ls *.tar|sed -e 's/\.tar//'`

do

      mkdir $i

      mv ${i}.tar $i

done



END[/code:1:aa88cc01b3]



继续学习ing!!!

 

 wingger 回复于:2004-11-16 09:06:47 

to mymm



俺现在对grep,sed,awk等还是太了解,如果以后碰到会再加入的,发贴的过程中,因为需要概括,一下子就能发现自己哪些没理解了 :lol:  :lol:  :lol:

 

 odin_free 回复于:2004-11-18 09:31:14 

文革 要带来新的学习气氛阿~~~:)

 

 prowoo 回复于:2004-11-18 17:43:14 

支持!!!!!!!111

 

 sunnysfg 回复于:2004-12-31 13:40:35 

studying now……

 

 豌豆豆 回复于:2005-01-27 16:26:17 

唉....来晚了....

慢慢学习ing.....

佩服死文革MM了......

 

 阿贵2006 回复于:2005-04-06 02:20:21 

文革JJ是我学习的榜样 :em03:  :em03:  :em03:

 

 YGC 回复于:2005-06-12 11:10:58 

[quote:09f2733dee]

用read可以倒着读一个文件?



用现成的rev和tac就可以 [/quote:09f2733dee]



又学习新命令。。。:)

 

 YGC 回复于:2005-06-12 15:05:24 

又看完一篇。。

学习中。。。

 

 guoliangbo 回复于:2005-06-12 23:47:47 

[quote:ea1244367d="wingger"]



如下形式 

代码: 

$ cat myfile | more 

或 

$ cat myfile | pg 

[/quote:ea1244367d]



减少击键次数,我用

  [code:1:ea1244367d]

    $ more file

or



   $ less file



more ,  less 二者有些区别,用前者的人多,其实后者功能更强。



   pg 是UNIX里面的,Red Hat 里面没有,《LINUX & UNIX SHELL PROGRMMING GUIDE》里面用pg。[/code:1:ea1244367d]

 

 huchengming56 回复于:2005-08-18 14:32:54 

呵呵,看了以后,功能大增啦 !

W.G 实在是太有耐性了,PF PF
  • 上一篇文章: shell命令(一)
  • 下一篇文章: shell命令
  • 域浪网络ISP经营许可证 深圳地址:深圳市罗湖区宝安北路国际商品交易大厦七楼C30室
    Tel:0755-82266883/82267566 Fax:0755-82261966
    邮编:518000 
                        Copyright © 2006-2008 elang.cn All Rights Reserved 深圳市域浪网络技术有限公司版权所有