5.1 echo
使用echo命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为: echo string
echo命令有很多功能,其中最常用的是下面几个:
\c 不换行。
\f 进纸。
\t 跳格。
\n 换行。
如果希望提示符出现在输出的字符串之后,可以用: $ echo “What is your name :\c” $ read name
上面的命令将会有如下的显示: $ What is your name: □
其中“□”是光标。
如果想在输出字符之后,让光标移到下一行,可以用: $ echo "The red pen ran out of ink"
还可以用echo命令输出转义符以及变量。在下面的例子中,你可以让终端铃响一声,显示出$HOME目录,并且可以让系统执行tty命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号)。 $ echo "\007your home directory is $HOME, you are connected on `tty`" your home directory is /home/dave, you are connected on /dev/ttyp1
如果是LINUX系统,那么......必须使用-n选项来禁止echo命令输出后换行: $ echo -n "What is your name :"
必须使用-e选项才能使转义符生效: $ echo -e ”\007your home directory is $HOME, you are connected on `tty`“
your home director is /home/dave, you are connected on /dev/ttyp1
如果希望在echo命令输出之后附加换行,可以使用\n选项: $ cat echod #!/bin/bash echo "this echo's 3 new lines \n\n\n" echo "OK"
运行时会出现如下输出: $ ./echod this echo's 3 new lines OK
还可以在echo语句中使用跳格符,记住别忘了加反斜杠\: $ echo "here is a tab\there are two tabs\t\tok" here is a tab there are two tabs ok
如果是LINUX系统,那么...别忘了使用-e选项才能使转义符生效: $ echo -e "here is a tab\there are two tabs\t\tok" here is a tab there are two tabs ok
如果想把一个字符串输出到文件中,使用重定向符号>。在下面的例子中一个字符串被重定向到一个名为myfile的文件中: $ echo "The log files have all been done"> myfile
或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容: $ echo "$LOGNAME carried them out at `date`">>myfile
现在让我们看一下myfile文件中的内容: $ cat myfile The log files have all been done root carried them out at Sat May 22 18:25:06 GMT 1999
初涉shell的用户常常会遇到的一个问题就是如何把双引号包含到echo命令的字符串中。
引号是一个特殊字符,所以必须要使用反斜杠\来使shell忽略它的特殊含义。假设你希望使用echo命令输出这样的字符串:"/dev/rmt0",那么我们只要在引号前面加上反斜杠\即可: $echo "\"/dev/rmt0"\" "/dev/rmt0" 5.2 read
可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。
它的一般形式为: read varible1 varible2 ...
在下面的例子中,只指定了一个变量,它将被赋予直至回车之前的所有内容: $ read name Hello I am superman $ echo $name Hello I am superman
在下面的例子中,我们给出了两个变量,它们分别被赋予名字和姓氏。shell将用空格作为变量之间的分隔符: $ read name surname John Doe $ echo $name $surname John Doe
如果输入文本域过长,Shell 将所有的超长部分赋予最后一个变量。下面的例子,假定要读取变量名字和姓,但这次输入三个名字,结果如下: $ read name surname John Lemon Doe $ echo $name John $ echo $surname Lemon Doe
在上面的例子中,如果我们输入字符串John Lemon Doe,那么第一个单词将被赋给第一个变量,而由于变量数少于单词数,字符串后面的部分将被全部赋给第二个变量。在编写shell脚本的时候, 如果担心用户会对此感到迷惑,可以采用每一个read语句只给一个变量赋值的办法: $ cat var_test #!/bin/bash # var_test echo “First name:\c” read name echo “Middle name:\c” read middle echo “Last name:\c” read surname
用户在运行上面这个脚本的时候,就能够知道哪些信息赋给了哪个变量。 $ ./var_test First name: John Middle name: Lemon Last name: Doe
如果是LINUX系统,那么......别忘了使用“-n”选项。 $ cat var_test #!/bin/bash # var_test echo -n “First name:\c” read name echo -n “Middle name:\c” read middle echo -n “Last name:\c” read surname
$ less myfile This is great
还可以使用cat命令来显示控制字符。这里有一个对从DOS机器上ftp过来的文件进行检察的例子,在这个例子中,所有的控制字符都在行末显示了出来。 $ cat -v life.tct
ERROR ON REC AS12^M
ERROR ON REC AS31^M
有一点要提醒的是,如果在敲入了cat以后就直接按回车,该命令会等你输入字符。如果你本来就是要输入一些字符,那么它除了会在你输入时在屏幕上显示以外,还会再回显这些内容;最后按结束输入即可。
5.4 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:
命令1 |命令2
其中|是管道符号。
在下面的例子中,在当前目录中执行文件列表操作,如果没有管道的话,所有文件就会显示出来。当shell看到管道符号以后,就会把所有列出的文件交给管道右边的命令,因此管道的含义正如它的名字所暗示的那样:把信息从一端送到另外一端。在这个例子中,接下
来grep命令在文件列表中搜索quarter1.doc: $ ls | grep quarter1.doc
quarter1.doc
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为:
命令1 |命令2
其中|是管道符号。
在下面的例子中,在当前目录中执行文件列表操作,如果没有管道的话,所有文件就会显示出来。当shell看到管道符号以后,就会把所有列出的文件交给管道 右边的命令,因此管道的含义正如它的名字所暗示的那样:把信息从一端传送到另外一端。在这个例子中,接下来grep命令在文件列表中搜索 quarter1.doc:
$ ls | grep quarter1.doc
quarter1.doc $ ls
accounts.doc acc_LPSO.doc quarter1.doc quarter1.doc quarter2.doc
sed、awk和grep都很适合用管道,特别是在简单的一行命令中。在下面的例子中,who命令的输出通过管道传递给awk命令,以便只显示用户名和所在的终端。 $ who | awk '{print $1"\t"$2}' matthew pts/0 louise pts/1
如果你希望列出系统中所有的文件系统,可以使用管道把df命令的输出传递给awk命令,awk显示出其中的第一列。你还可以再次使用管道把awk的结果传递给grep命令,去掉最上面的题头filesystem。 $ df -k | awk '{print $1}'| grep -v "Filesystem" /dev/sda5 /dev/sda6 /dev/sda7 /dev/sda8
当然,你没准还会希望只显示出其中的分区名,不显示/dev/部分,这没问题;我们只要在后面简单地加上另一个管道符号和相应的sed命令即可。 $ df -k | awk '{print $1}'| grep -v "Filesystem" | sed s'/\/dev\///g1' sda5 sda6 sda7 sda8
在这个例子中,我们先对一个文件进行排序,然后通过管道输送到打印机。 $ sort myfile | lp 5.5 tee
tee命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。
它的一般形式为: tee -a files
其中,-a表示追加到文件末尾。
当执行某些命令或脚本时,如果希望把输出保存下来,tee命令非常方便。
下面我们来看一个例子,我们使用who命令,结果输出到屏幕上,同时保存在who.out文件中: $ who | tee who.out louise pts/1 May 20 12:58 (193.132.90.9) matter pts/0 May 20 11:30 (193.123.22.1) $ cat who.out louise pts/1 May 20 12:58 (193.132.90.9) matter pts/0 May 20 11:30 (193.123.22.1)
在下面的例子中,我们把一些文件备份到磁带上,同时将所备份的文件记录在tape.log文件中。由于需要不断地对文件进行备份,为了保留上一次的日志,我们在tee命令中使用了-a选项。
$ find etc usr/local home -depth -print | cpio -ovC65536-O /dev/rmt/0n| tee -a tape.log
在上面的例子中,第一行末尾的反斜杠\告诉shell该命令尚未结束,应从下面一行继续读入该命令。可以在执行脚本之前,使用一个echo命令告诉用户谁在执行这个脚本,输出结果保存在什么地方。
$ echo "myscript is now running, check out any errors…in myscript.log" | tee -a myscript.log
$ ./myscript | tee -a myscript.log
如果不想把输出重定向到文件中,可以不这样做,而是把它定向到某个终端上。在下面的例子中,一个警告被发送到系统控制台上,表明一个磁盘清理进程即将运行。 $ echo "stand-by disk cleanup starting in 1 minute"| tee /dev/console
可以让不同的命令使用同一个日志文件,不过不要忘记使用-a选项。
$ sort myfile | tee -a accounts.log
$ ./myscript | tee -a accounts.log