输入输出相关命令
一、回显命令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。