Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493481
  • 博文数量: 174
  • 博客积分: 2502
  • 博客等级: 少校
  • 技术积分: 1923
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-28 09:47
文章分类

全部博文(174)

文章存档

2011年(8)

2010年(16)

2009年(68)

2008年(82)

我的朋友

分类: 系统运维

2008-11-01 16:13:46

在看这个之前,像俺这样没有基础的,得先看完网中人的《shell十三问》的前三章,在置顶处,所以前面echo的含义,参数,及基础用法等就不说了。
我下面的所有环境都在在REDHAT LINUX9下试验的
在LINUX中,要使转义符生效,需加参数-e


从echo的变量开始说起
如:e c h o命令输出转义符以及变量。

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
#


QUOTE:
本例中
\007或\a你可以让终端铃响一声
显示出$ H O M E目录,
并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号 )。
在e c h o命令输出之后附加换行,可以使用\ n选项:

CODE:
$ cat echod
#!/bin/sh
echo -e "this echo's 3 new lines\n\n\n"
echo "OK"
编辑一个新echod,如上内容,然后运行输出如下:

CODE:
$ ./echod
this echo's 3 new lines



OK
$
在e c h o语句中使用跳格符,记住别忘了加反斜杠\:

CODE:
$ echo -e "here is a tab\there are two tabs\t\tok"
here is a tab   here are two tabs               ok
$
把一个字符串输出到文件中,使用重定向符号>。
在下面的例子中一个字符串被重定向到一个名为m y f i l e的文件中:


CODE:
$ echo "The log files have all been done"> myfile
或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:

CODE:
$ echo "$LOGNAME carried them out at `date`">>myfile
现在让我们看一下m y f i l e文件中的内容:

QUOTE:
The log files have all been done
sam carried them out at 六 11月 13 12:54:32 CST 2004
引号是一个特殊字符,所以必须要使用反斜杠\来使s h e l l忽略它的特殊含义。
假设你希望使用e c h o命令输出这样的字符串:“/ d e v / r m t 0”,那么我们只要在引号前面加上反斜杠\即可:

CODE:
$ echo "\"/dev/rmt0"\"
"/dev/rmt0"
$
其它用法:

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


ANSI控制码
%B7%C9%BB%D2%B3%C8


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

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

如下形式

CODE:
$ cat myfile | more

$ cat myfile | pg
c a t命令的一般形式为:

CODE:
cat [options] filename1 ... filename2 ...
1、显示名为m y f i l e的文件:

CODE:
$ cat myfile
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
3、创建一个包含上述三个文件的内容,名为b i g f i l e的文件,可以用输出重定向到新文件中:

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

CODE:
$ cat
Hello world
Hello world  

$
5、新建文件

CODE:
$cat >myfile
This is great

$cat myfile
This is great
cat:参数选项

使用方式:

CODE:
cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)

参数:

QUOTE:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting 显示非打印字符
例:
显示时加上行号

CODE:
$cp /etc/httpd/conf/httpd /usr/sam
$ cat -n httpd.conf
把 httpd.conf 的内容加上行号后输入 httpd1.conf 这个文件里

CODE:
$cat -n httpd.conf > httpd1.conf
对文件httpd.conf加上行号(空白不加)后显示

CODE:
$ cat -b httpd.conf
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。

CODE:
$ cat -b textfile1 textfile2 >> textfile3
清空/etc/test.txt档案内容

CODE:
$cat /dev/null > /etc/test.txt
使用 sed 与 cat 除去空白行

CODE:
$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d'
-s项我试了一下,不成功,不知是不是用错了


其它参数来自:(这个我没试)


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

QUOTE:
* -T 将制表符显示为 ^I

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

* -E 在每一行的结束处添加美元符($)。
显示非打印字符

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:
$ 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:
$ 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
...
cat -n 应该还可以吧

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

  语   法: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
  例一: 把列出当前目录,并把结果结到myfile里
  

CODE:
$ls -l |tee myfile
管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:

CODE:
命令1 |命令2
其中|是管道符号。
上例就是

标准输入、输出和错误

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

QUOTE:
文件文件描述符
输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。
错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

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


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

CODE:
常用文件重定向命令
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 <&- 把关闭标准输入
例子

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


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


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


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命令最贴切的说法就是:当这个脚本结束时,相应的会话可能就结束了。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。

这章到此为止了


读网中人十三问的第四问的理解:
1、变量一定得用""
2、处理顺序要搞清楚:这两行一定要牢牢记在脑中

QUOTE:
命令格式
command-name options argument
处理过程:
shell 会依据 IFS(Internal Field Seperator) 将 command line 所输入的文字给拆解为"字段"(word)。
然后再针对特殊字符(meta)先作处理,
最后再重组整行 command line 。
3、例子:
空格的好理解,但CR字符不好理解,如'',""

CODE:
   $ A='B
   > C
   > '
   $ echo "$A"
   B
   C
   $ echo $A
   B C
echo 的$A加上soft quote后,得出的结果不同了,
第一个是断行字符(new line),取消了CR和IFS的功能
第二个应该是一个空格了,仅取消CR功能,而保留IFS功能
第三个是CR

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

而在escape中

CODE:
   $ A=B\
   > C\
   >
   $ echo $A
   BC
   $ echo "$A "
   BC
得出的结果是BC,原因:
键本身在 shell meta 中的特殊性,在 \ 跳脱后面,仅仅取消其 CR 功能,而不会保留其 IFS 功能(空格)。 因此就是(NULL)

因此在上面两个例子中 键所产生的字符有四种:

QUOTE:
CR (结束命令)
IFS (空格)
NL(New Line) (断行)
NULL (空)
不知我的理解是否正确,还望各位指点,呵呵,我感觉这样说好像更容易理解 :oops:
上面理解了,下面就不难了,找个地方放一下,俺怕自己给忘了

而接下来的例子中,则要理解shell meta 与 command meta

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

如果输入下例命令就会出错:

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

要解决之,可用 hard quote :

CODE:
$ awk '{print $0}' 1.txt
将原本的 {、、$(注三)、} 这几个 shell meta 关闭, 避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。
( 注三:而其中的 $0 是 awk 内建的 field number ,而非 awk 的变量,awk 自身的变量无需使用 $ 。)


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

CODE:
awk "{print \$0}" 1.txt
awk \{print\ \$0\} 1.txt
第一行:由于soft quote中没法关闭$,因此用\来关闭$meta
第二行:\{关闭{,\ (\空格,关闭空格键),\$,\}就不用说了


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

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

CODE:
$ awk '{print $$A}' 1.txt
因为 $A 的 $ 在 hard quote 中是不能替换变量的。

可以使用如下几种方案:

CODE:
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 中
上面得注意$和''和""的包含位置
精华啊!!!

学习ing!!!

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

如:

CODE:
ftp -ni <open 192.168.20.100
user username  pwd
bin
prom
cd /u
mput *
close
bye
ENDOFSCRIPT


CODE:
cat > mvfile.sh <<\END

for i in `ls *.tar|sed -e 's/\.tar//'`
do
      mkdir $i
      mv ${i}.tar $i
done

END
继续学习ing!!!


 原文地址
阅读(814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~