输入输出相关命令

一、回显命令echo

功能:将参数指定的字符串输出到标准输出。

格式:echo [option] string

常用选项:

E:禁用转义字符(默认)。

e:启用转义字符。

n:输出结束后不换行。

用法示例:

(1)echo命令最常用的是输出字符串(不加任何选项时,默认是屏蔽转义字符的):

[root@localhost ~]# echo "The first line.\nThe second line.\nField1\tField2"
The first line.\nThe second line.\nField1\tField2

(2)使用转义字符以便于阅读(例如:/t分割字段,/n换行)

[root@localhost ~]# echo -e "The first line.\nThe second line.\nField1\tField2"
The first line.
The second line.
Field1  Field2

(3)获取用户的输入的提示信息通常都不会换行:

[root@localhost ~]# echo -n "Please enter your name:"
Please enter your name:

echo的n选项通常与读取输入命令read配合使用。

(4)echo与特殊字符配合使用,在输出字符串中添加变量、命令输出等内容:

[root@localhost ~]# echo "Host $HOST_DOWN_NAME non-response,time is:`date +'%Y-%m-%d'`"
Host  non-response,time is:2013-12-05

上述命令中,美元符号$引用变量,反引号``(Esc下面那个按键)引用命令的输出。

(5)echo与重定向配合输出错误信息(通常用在shell脚步中):

二、接收用户输入命令read

格式:read [[option]parameter] name

常用选项:

a:将输入的文本按字段放入数组中(默认使用的分隔符为空格或制表符Tab),数组的下标从0开始。

d:指定结束符,当输入中出现指定的结束符时,read命令将认为输入已经结束(默认使用换行为结束符)。

e:从标准输入读取时,使用Readline库获取输入(此时用户可以使用退格键、方向键进行简单的行编辑操作)。

n:指定要读取的字符数。

p:将该选项指定的字符串输出到标准错误,并读取输入。

r:将读取到的字符串按字段放到不同的变量中。(默认的字段分隔符为空格、制表符Tab)

s:先锁住屏幕,然后再从标准输入中读取字符。

t:如果用户在指定的时间内没有输入,就结束读取状态(单位为秒)。

u:从指定的文件描述符中读取。

大多数情况下,read命令都从标准输入读取用户输入,读取到数据后,read命令会将数据放入指定的变量中。

当read命令读取的目标是一个文件时,如果没有特别指定,read会使用换行符作为结束读取标记,即按行读取文件内容。

用法示例:

(1)提示用户并接收输入

[root@localhost ~]# echo -n "Please enter your name:";read NAME;echo "Hello $NAME"!
Please enter your name:Tom
Hello Tom!

(2)读取多个数据并保存到数组中

[root@localhost ~]# echo -n "Please enter your friend's name:";read -a NAME;echo "Your friends:${NAME[*]}"
Please enter your friend's name:Tom Jim Kate
Your friends:Tom Jim Kate

(3)指定输入结束符

[root@localhost ~]# echo -n "Please enter your name:";read -d "$" NAME;echo "Hello $NAME"!
Please enter your name:Tom
Jim
Kate
$Hello Tom
Jim
Kate!

(4)使用行编辑器

[root@localhost ~]# echo -n "Please enter your message:";read -e MESS;echo "your message is:$MESS"
Please enter your message:Good idea!
your message is:Good idea!

(5)指定接收的字符长度

输入一些格式化的字符串,如学号、手机号码等:

[root@localhost ~]# echo -n "Please enter your phone number:";read -n 11 PHONE;echo -e "\nYour phone number is:"$PHONE
Please enter your phone number:18334707686
Your phone number is:18334707686

(6)输出标准错误信息

[root@localhost ~]# read -p "Unexpected error, press Y key to continue." Flag;echo "Being restored, please wait..."
Unexpected error, press Y key to continue.y
Being restored, please wait...

(7)读取输入并保存到多个变量中

[root@localhost ~]# echo -n "Please enter the four stirng:";read -r V1 V2 V3 V4;echo -e "first:$V1\nsecond:$V2\nthird:$V3\nfourth:$V4"
Please enter the four stirng:one two three four
first:one
second:two
third:three
fourth:four

如果字段分隔符不是空格和制表符Tab,可以通过修改变量IFS的方法重新设置分隔符。例如设置新的字段分隔符#,并接收用户的输入:

[root@localhost ~]# IFS="#";echo -n "Please enter the four stirng:";read -r V1 V2 V3 V4;echo -e "first:$V1\nsecond:$V2\nthird:$V3\nfourth:$V4"
Please enter the four stirng:one#two#three#four
first:one
second:two
third:three
fourth:four

使用以上命令时,建议在修改IFS变量值之前,使用命令Old_IFS=$IFS保存默认的分隔符,使用结束后使用命令IFS=$Old_IFS恢复默认的分隔符。

(8)锁住屏幕

例如要求用户输入密码:

[root@localhost ~]# echo -n "Please enter your password:";read -s Pass;echo -e "\nYour password is:"$Pass
Please enter your password:
Your password is:123456

(9)设置输入超时限制

用户超过一定时间没有输入,则使用一个默认值替代用户的输入。例如设置用户的输入时间为8秒:

[root@localhost ~]# SE=y;echo -n "Please select yes or no[y][n]:";read -t 8 SE;echo -e "\nInput timeout,use the default options[y]."
Please select yes or no[y][n]:
Input timeout,use the default options[y].

三、显示并保存文本命令tee

tee是一个比较常用的命令,它的作用是将获取到的数据(tee命令获取的数据通常来自管道)分为两个拷贝,一个拷贝输出到标准输出,另一个拷贝写入到指定的文件中。

命令格式:…… | tee [option] filename

常用选项:

a:以追加的形式将数据写入到文件的结尾

i:写入数据时,不写入标准错误

用法示例:

(1)例如,将指定的网络接口卡信息输出到屏幕的同时也写入文件中:

[root@localhost ~]# ifconfig eth0 | tee eth0_info
eth0      Link encap:Ethernet  HWaddr 00:0C:29:2D:91:47  
          inet addr:192.168.1.5  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe2d:9147/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15874 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8067 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1386096 (1.3 MiB)  TX bytes:928720 (906.9 KiB)
          Interrupt:67 Base address:0x2024 

[root@localhost ~]# cat eth0_info
eth0      Link encap:Ethernet  HWaddr 00:0C:29:2D:91:47  
          inet addr:192.168.1.5  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe2d:9147/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15874 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8067 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1386096 (1.3 MiB)  TX bytes:928720 (906.9 KiB)
          Interrupt:67 Base address:0x2024

(2)如果不希望tee命令使用覆盖的方式将数据写入到文件,可以使用选项a以追加的方式写入文本结尾:

[root@localhost ~]# date +'%Y%m%d %T' | tee -a date_log
20131205 09:42:07
[root@localhost ~]# cat date_log
20131205 09:42:03
20131205 09:42:07

(3)tee命令还提供了简单的筛选功能,有时得到的数据中不仅含有标准输出,还含有标准错误,此时可以使用选项i忽略标准错误:

[root@localhost ~]# ls -l ab | tee a.txt
ls: ab: No such file or directory
[root@localhost ~]# cat a.txt
[root@localhost ~]#

四、邮件命令mail

mail是Linux系统自带的电子邮件命令,通常可以用这个命令发送、阅读电子邮件。

1、发送电子邮件

命令格式:mail [option] [-s subject] [-c c_address] [-b b_address] user [-a file] ……

常用选项:

n:不读入设置文件/etc/mail.rc(这个文件允许用户使用外部地址而不是系统自带的sendmail发送邮件)。

s:设置邮件的主题信息。

c:使用一个密件抄送列表。

b:使用一个抄送列表。

注:关于发往、抄送和密送      可以使用“发往”、“抄送”和“密送”框将单个项目发送给任意多个收件人。通过指定这三个递送类型之一,可以指出希望从每个收件人获得的响应。 使用“发往”框可以寻址项目的主要收件人。使用“抄送”框可以寻址对内容感兴趣,或者可能需要获得信息的公共通知,但并不要求其作出响应的收件人。使用“密送”框寻址对内容感兴趣,但希望对其他收件人保持匿名的收件人。 接收项目的每个人都能看到所有主要收件人和抄送收件人的列表,但看不到密送收件人的列表。

用法示例:

(1)发送邮件时,通常将邮件的正文放入一个文件内,然后使用重定向的方式读取并发送文件中的内容。例如要将文件eth0_info中的内容发送给用户root和zhu,并将邮件的主题设置为eth0 info:

[root@localhost ~]# mail -s "ehth0 info" root,zhu <eth0_info

提示:如果接收邮件的用户或地址有多个,可以使用逗号和空格作为邮件列表的分隔符。

(2)使用mail发送邮件时,除了使用系统中的用户作为地址外,还可以使用外部邮箱作为地址(前提条件是网络处于可用状态)。例如:

[root@localhost ~]# mail -s "ehth0 info" root,zhu,zhuyongchang888@163.com <eth0_info

这样zhuyongchang888@163.com就可以收到一个来自root@localhost.localdomain的邮件(由于root@localhost.localdomain并不是一个可以返回的邮箱地址,因此某些邮箱可能会拒收此类邮件)。

2、查看邮件

有时系统中的用户可能会收到如下提示信息:

You have new mail in /var/spool/mail/root

这个提示信息将告诉用户接收到新的系统邮件。

(1)可以使用命令mail查看邮件列表:

[root@localhost ~]# mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 13 messages 1 new 13 unread
 U  1 logwatch@localhost.l  Sat Nov 16 01:47 133/4206  "Logwatch for localhost.localdomain (Linux)"
 U  2 logwatch@localhost.l  Sat Nov 16 04:42 144/4434  "Logwatch for localhost.localdomain (Linux)"
 U  3 logwatch@localhost.l  Sun Nov 17 04:02  44/1639  "Logwatch for localhost.localdomain (Linux)"
 U  4 logwatch@localhost.l  Mon Nov 18 04:14  44/1639  "Logwatch for localhost.localdomain (Linux)"
 U  5 logwatch@localhost.l  Tue Nov 19 19:45  45/1693  "Logwatch for localhost.localdomain (Linux)"
 U  6 logwatch@localhost.l  Wed Nov 20 04:02 137/5602  "Logwatch for localhost.localdomain (Linux)"
 U  7 logwatch@localhost.l  Mon Dec  2 04:02  44/1636  "Logwatch for localhost.localdomain (Linux)"
 U  8 logwatch@localhost.l  Tue Dec  3 11:17  64/2114  "Logwatch for localhost.localdomain (Linux)"
 U  9 logwatch@localhost.l  Thu Dec  5 08:49 105/3921  "Logwatch for localhost.localdomain (Linux)"
 U 10 root@localhost.local  Thu Dec  5 10:03  25/1174  "ehth0 info"
 U 11 root@localhost.local  Thu Dec  5 10:07  25/1193  "ehth0 info"
 U 12 MAILER-DAEMON@localh  Thu Dec  5 10:07  76/3059  "Returned mail: see transcript for details"
>N 13 root@localhost.local  Thu Dec  5 10:09  25/1197  "ehth0 info"
&

在上面这个示例中,前两行打印出了Mail的版本号、如何获取帮助信息、当前邮箱中邮件数目等内容。后面的邮件列表中符号“>”指示当前光标的位置,U表示未读邮件,其后分别是邮件序号、发件人、发件时间、邮件主题等内容。最后一行的“&”是邮件命令提示符,用户可以在此提示符后面输入命令并查看邮件。

(2)在邮件命令提示符中常用的命令如下:

h:查看邮件的标题。

d:使用该命令加序号可以删除指定的邮件。

f:查看当前光标指向的邮件。

n:跳转到指定序号的邮件。

q:退出并将已经阅读的邮件存入文件~/mbox中。

x:退出。

!:允许使用shell命令。

(3)通常建议退出时使用命令q,以便于将已阅读的邮件存入文件~/mbox中。如果要重新阅读mbox中的邮件,可以使用选项f:

[root@localhost ~]# mail -f
Mail version 8.1 6/6/93.  Type ? for help.
"/root/mbox": 8 messages
>   1 logwatch@localhost.l  Thu Nov 14 04:02  90/2887  "Logwatch for localhost.localdomain (Linux)"
    2 logwatch@localhost.l  Sat Nov 16 01:47 133/4207  "Logwatch for localhost.localdomain (Linux)"
    3 logwatch@localhost.l  Sat Nov 16 04:42 144/4435  "Logwatch for localhost.localdomain (Linux)"
    4 logwatch@localhost.l  Sun Nov 17 04:02  44/1640  "Logwatch for localhost.localdomain (Linux)"
    5 root@localhost.local  Thu Dec  5 10:03  25/1175  "ehth0 info"
    6 root@localhost.local  Thu Dec  5 10:07  25/1194  "ehth0 info"
    7 MAILER-DAEMON@localh  Thu Dec  5 10:07  76/3060  "Returned mail: see transcript for details"
    8 logwatch@localhost.l  Mon Nov 18 04:14  44/1640  "Logwatch for localhost.localdomain (Linux)"
&

(4)管理员也可以使用选项f查看其他用户的邮件,例如:

[root@localhost ~]# mail -f /var/spool/mail/zhu
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/zhu": 3 messages 3 new
>N  1 root@localhost.local  Thu Dec  5 10:03  24/1164  "ehth0 info"
 N  2 root@localhost.local  Thu Dec  5 10:07  24/1183  "ehth0 info"
 N  3 root@localhost.local  Thu Dec  5 10:09  25/1197  "ehth0 info"
&

五、启动新shell命令exec

exec命令用于启动一个新的shell,并在新shell中执行指定的命令。在实际应用中,exec命令常被用来处理文件描述符,此时(也只有在此时)exec不会启动新shell替代当前shell。

命令格式:exec shell-command

exec执行时,会使用新的shell替代当前shell(而不是启动子shell),如果没有特别指明,exec将在命令执行完成后退出启动的新shell。

用法示例:

(1)使用输入文件描述符读取文件的前3行的示例:

[root@localhost ~]# exec 3<ping.txt;read -u 3 line;read -u 3 line1;read -u 3 line2;echo -e "$line \n $line1 \n $line2";exec 3<&-
PING www.a.shifen.com (220.181.112.143) 56(84) bytes of data. 
 64 bytes from 220.181.112.143: icmp_seq=1 ttl=55 time=31.2 ms 
 64 bytes from 220.181.112.143: icmp_seq=2 ttl=55 time=30.3 ms

上面这个示例中,先将文件描述符3指向文件ping.txt(此处使用的是“3<”表示一个输入文件描述符3)。然后使用read命令的u选项,从文件描述符3中读取3次,并使用命令echo输出读取到的内容。最后的命令exec 3<&-表示关闭文件描述符3.

(2)输出文件描述符示例:

[root@localhost ~]# exec 4>name_list;echo -n "please enter a stirng:";read NAME1;echo -n "enter the seconde string:";read NAME2;echo -e "The first string:"$NAME1"\nThe second string:"$NAME2 >&4;exec 4>&-;cat name_list
please enter a stirng:Jhon
enter the seconde string:Alix
The first string:Jhon
The second string:Alix

注意:在关闭文件描述符时,必须指明文件描述符,如果将文件描述符0、1、2关闭则可能退出当前shell。

posted @ 2013-12-05 11:04  ITtecman  阅读(677)  评论(0编辑  收藏  举报