» » shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等) |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
在看这个之前,像俺这样没有基础的,得先看完网中人的《shell十三问》的前三章,在置顶处,所以前面echo的含义,参数,及基础用法等就不说了。 [b]我下面的所有环境都在在REDHAT LINUX9下试验的 在LINUX中,要使转义符生效,需加参数-e[/b]
从echo的变量开始说起 [b]如:e c h o命令输出转义符以及变量。[/b]
[code]# 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] [quote]本例中 \007或\a你可以让终端铃响一声 显示出$ H O M E目录, 并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号 )。[/quote]
[b]在e c h o命令输出之后附加换行,可以使用\ n选项:[/b]
[code]$ cat echod #!/bin/sh echo -e "this echo's 3 new lines\n\n\n" echo "OK"[/code] 编辑一个新echod,如上内容,然后运行输出如下: [code]$ ./echod this echo's 3 new lines
OK $[/code]
[b]在e c h o语句中使用跳格符,记住别忘了加反斜杠\:[/b]
[code]$ echo -e "here is a tab\there are two tabs\t\tok" here is a tab here are two tabs ok $[/code]
[b]把一个字符串输出到文件中,使用重定向符号>。 在下面的例子中一个字符串被重定向到一个名为m y f i l e的文件中:[/b]
[code]$ echo "The log files have all been done"> myfile[/code]
[b]或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:[/b] [code]$ echo "$LOGNAME carried them out at `date`">>myfile[/code]
[b]现在让我们看一下m y f i l e文件中的内容:[/b] [quote]The log files have all been done sam carried them out at 六 11月 13 12:54:32 CST 2004[/quote]
[b]引号是一个特殊字符,所以必须要使用反斜杠\来使s h e l l忽略它的特殊含义。[/b] 假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠\即可: [code]$ echo "\"/dev/rmt0"\" "/dev/rmt0" $[/code]
其它用法:
--〉'echo'用法收集:)
ANSI控制码 %B7%C9%BB%D2%B3%C8 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
支持!!! P.S:read的用法,r2007班主的精华贴里有 ;) |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "寂寞烈火" 发表:[/i] 支持!!! P.S:read的用法,r2007班主的精华贴里有 ;)[/quote] 我本来想不再继续了,发贴子满累的,嘿嘿 r2007的贴子在这里:
其它:可以自己练习 [code][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]
[code][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] var_test文件内容如上
[code][sam@chenwy sam]$ ./var_test First Name :wing Middle Name :er Last Name:chenwy[/code]
运行var_test文件
请问上面是不是把三个值赋给name,middle,surname三个变量了???
用read可以倒着读一个文件?
|
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "wingger" 发表:[/i]
我本来想不再继续了,发贴子满累的,嘿嘿 r2007的贴子在这里:
其它:[/quote] 班主,您辛苦了,我代表广大猜猜们向您致意 :em02: :em02: :em02: |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "寂寞烈火" 发表:[/i]
班主,您辛苦了,我代表广大猜猜们向您致意 :em02: :em02: :em02:[/quote] 呵呵,这些对你来说应该是小菜一碟
[quote][sam@chenwy sam]$ ./var_test First Name :wing Middle Name :er Last Name:chenwy [/quote]
运行var_test文件
请问上面是不是把三个值赋给name,middle,surname三个变量了??? |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
1,[quote]请问上面是不是把三个值赋给name,middle,surname三个变量了???[/quote] test:[quote] /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] 2,[quote] 用read可以倒着读一个文件?[/quote] 用现成的rev和tac就可以 P.S: [quote] 呵呵,这些对你来说应该是小菜一碟[/quote] 哪里哪里,我只不过是一个fans而已,我的job跟IT一点关西都没有 :( 很多知识还得向你请教呢 ;) |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote]/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]
这个俺知道
我是说在脚本里,像我上面那个
[code][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]
执行这个脚本里,是不是分别赋值了,俺怎么看还是空的呢? |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote] 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] 这个脚本里,你用read分别给3个变量赋了值 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "寂寞烈火" 发表:[/i]
这个脚本里,你用read分别给3个变量赋了值[/quote]
按理是这样的,可是,echo $name $middle $surname是空的 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "wingger" 发表:[/i]
按理是这样的,可是,echo $name $middle $surname是空的[/quote] 不会吧 /home/lee#cat f[code] 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] /home/lee#sh f First Name :j Middle Name :m Last name :l j m l |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
echo $name $middle $surname
得把这个加入脚本里 :oops: :oops: :oops: |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "wingger" 发表:[/i] echo $name $middle $surname
得把这个加入脚本里 :oops: :oops: :oops:[/quote] 晕~~~~,麻烦你看仔细点呀 :em08: :em08: |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
呵呵,我明白了
[quote]/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 [/quote]
不好意思,我理解有错,我原来以为可以有这样的结果 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[b]cat:显示文件内容,创建文件,还可以用它来显示控制字符。[/b]
注意:在文件分页符处不会停下来;会一下显示完整个文件。因此,可以使用m o r e命令或把c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,使用命令less file可实现相同的功能。
如下形式 [code]$ cat myfile | more 或 $ cat myfile | pg[/code]
c a t命令的一般形式为:
[code]cat [options] filename1 ... filename2 ...[/code]
1、显示名为m y f i l e的文件:
[code]$ cat myfile[/code]
2、显示m y f i l e 1、m y f i l e 2、m y f i l e 3这三个文件,可以用:
[code]$ cat myfile1 myfile2 myfile3[/code]
3、创建一个包含上述三个文件的内容,名为b i g f i l e的文件,可以用输出重定向到新文件中:
[code]$ cat myfile1 myfile2 myfile3 > bigfile[/code]
4、如果cat的命令行中没有参数,输入的每一行都立刻被cat命令输出到屏幕上,输入完毕后按< C T R L - D >结束
[code]$ cat Hello world Hello world
$[/code]
5、新建文件
[code]$cat >myfile This is great
$cat myfile This is great[/code]
[b][color=red]cat:参数选项[/color][/b]
使用方式: [code]cat [-AbeEnstTuv] [--help] [--version] fileName [/code] 说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
[quote]-n 或 --number 由 1 开始对所有输出的行数编号 -b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号 -s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -v 或 --show-nonprinting 显示非打印字符[/quote]
例: 显示时加上行号 [code]$cp /etc/httpd/conf/httpd /usr/sam $ cat -n httpd.conf [/code]
把 httpd.conf 的内容加上行号后输入 httpd1.conf 这个文件里 [code]$cat -n httpd.conf > httpd1.conf [/code]
对文件httpd.conf加上行号(空白不加)后显示 [code]$ cat -b httpd.conf [/code]
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。 [code]$ cat -b textfile1 textfile2 >> textfile3[/code]
清空/etc/test.txt档案内容 [code]$cat /dev/null > /etc/test.txt [/code]
使用 sed 与 cat 除去空白行 [code]$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d' [/code]
-s项我试了一下,不成功,不知是不是用错了
[b]其它参数来自:[/b](这个我没试)
cat 还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。您可以用以下选项来显示制表符:
[quote]* -T 将制表符显示为 ^I
* -v 显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。例如,当您处理一个在 Windows 系统中生成的文件时,这个文件将使用 Control-M(^M)来标记行的结束。对于代码大于 127 的字符,它们的前面将会被加上 M-(表示“meta”),这与其它系统中在字符前面加上 Alt- 相当。
* -E 在每一行的结束处添加美元符($)。 [/quote]
显示非打印字符
[code]$ 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]
[code]$ 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]
[code]$ 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] |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
cat我常用: cat file cat -A file 别的基本不用 ;) |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "寂寞烈火" 发表:[/i] cat我常用: cat file cat -A file 别的基本不用 ;)[/quote]
cat -n 应该还可以吧
[b]tee:读取标准输入的数据,并将其内容输出成文件。[/b]
语 法:tee [-ai][--help][--version][文件…] 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。
参 数:-a 附加到既有文件的面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数,数据会新增在该文件内容的最面,而不会删除原先之内容。 -i 忽略中断信号 --help 在线帮助 --version 显示版本信息
例一: 列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3: [code]$ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3[/code]
例一: 把列出当前目录,并把结果结到myfile里 [code]$ls -l |tee myfile[/code]
[b]管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:[/b]
[code]命令1 |命令2 其中|是管道符号。[/code] 上例就是 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "wingger" 发表:[/i]
不好意思,我理解有错,我原来以为可以有这样的结果[/quote] 你向下面这样运行就可以了 [quote][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] |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "whtlly"][/quote 发表:[/i]
呵呵,真的可以耶,差别在哪,俺不知道,找找资料 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
看十三问之六 |
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
[quote][i]原帖由 "whtlly"]看十三问之六[/quote 发表:[/i]
thx :lol: :lol: :lol: |
Copyright © 2001-2005 ChinaUnix.net All Rights Reserved 联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 京ICP证041476号 |