输入输出
时间:2008-04-23 来源:peitomb
  1.echo
  显示文本行或变量,或把字符串输入到文件,形式:echo string
  echo命令功能:
  \c  不换行
  \f 进纸
  \t 跳格
  \n 换行
  希望提示符出现在输出的字符串之后,可以用:
  $ echo "What isyou name :\c"
  $ read me
  可以用echo命令输出转义符以及变量。
  $ echo "\007your home directory is $HOME, you are connected on 'tty'"
  如果想把一个字符串输出到文件中,使用重定向符号>。
  字符串被重定向到一个名为myfile的文件中
  $ echo "The log files have all been done"> myfile
  或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:
  $ echo "$LOGNAME carried them out at 'date'">>myfile
  把引号输出,在引号前面加上反斜杠\
  $ echo "\"/dev/rmt0"\"
  2.read
  从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。
  形式:
  read variable1 variable2 ...
  指定一个变量
  $ read name
  Hello I am superman
  $ echo $name
  Hello I am superman
  指定两个变量,shell用空格作为变量之间的分隔符
  $ read name surname
  John Lemon Doe
  $ echo $name
  John
  $ echo $surname
  Lemon Doe
  3.cat
  如果希望每次显示一页,可以使用more命令或把cat命令的输出通过管道传递到另外一个具有分页功能的命令中
  例子:
  $ cat myfile | more
  或
  $ cat myfile | pg
  cat 最有用的选项就是:
  -v 显示控制字符
  如果希望创奸一个名为bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出重定向到新文件中:
  $ cat myfile1 myfile2 myfile3 > bigfile
  如果想创建一个文件,并向其中输入一些内容,只需使用cat 命令把标准输出重定向到该文件中,这时cat命令的输出是标准输入--键盘,输入一些文字,输入完毕后按CTRL-D结束输入
  $ cat > myfile
  This is great
  <CTRL-D>
  cat显示控制字符
  $ cat -v life.tct
  4.管道
  通过管道把一个命令的输出传递给另一个命令的输入。管道用竖杠 | 表示。形式:命令1|命令2
  eg1:
  在当前目录中执行文件列表操作,如果没有管道的话,所有文件就会显示出来。当shell看到管道符号以后,就会把所有列出的文件交给管道右边的命令。接下来用grep命令在文件列表中搜索quarter1.doc
  $ ls | grep quarter1.doc
  sed、awk和grep都很适合用管道
  eg2:
  who 命令的输出通过管道传递给awk命令,以便只显示用户名和所在的终端
  $ who | awk '{print $1"\t"$2}'
  列出系统所有的文件系统,可以使用管道把df命令的输出传递给awk命令,awk显示出其中的第一列。还可以再次使用管道把awk的结果传递给grep命令,去掉最上面的题头filesystem
  $ df -k | awk '{print $1}' | grep -v "Filesystem"
  只显示其中的分区名,不显示/dev/部分
  $ df -k | awk '{print $1}' | grep -v "Filesystem" | sed s'/\/dev\///g'
  先对一个文件进行排序,然后通过管道输送到打印机
  $ sort myfile | lp
  5.tee
  tee命令作用是:它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望看到输出的同时,也将其存入一个文件:
  一般形式为:
  tee -a files
  -a表示追加到文件末尾
  eg :
  使用who 命令,结果输出到屏幕上,同时保存在who.out文件中:
  $ who | tee who.out
  把一些文件备份到磁带上,同时所有备份的文件记录在tape.log文件中。
  $ find etc usr/local home -depth -print | cpio -vC65536 -O /dev/rmt/0n | tee -a tape.log
  可以在执行脚本之前,使用一个echo 命令告诉用户谁在执行这个脚本,输出保存在什么地方
  $ echo "myscript is now running, check out any erros...in myscript.lg" | tee -a myscript.log
  $ myscript | tee -a myscript.log
  如果不想输出重定向到文件中,可以不这样做,而是把它定向到某个终端上。
  警告被发送到系统控制台上或(tty),表明一个磁盘清理进程即将运行
  $ echo "stand-by disk cleanup starting in 1 minute" | tee /dev/console
  如果让不同的命令使用同一个日志文件,不要忘记使用-a选项
  $ sort myfil| tee -a accounts.log
  $ myscript | tee -a accounts.log
  6.标准输入、标准输出和错误
  --------------------------------------------------------
   文件    文件描述符
  --------------------------------------------------------
   输入文件---标准输入  0
   输出文件---标准输出  1
   错误输出文件---标准错误  2
  --------------------------------------------------------
  7.文件重定向
    常用文件重定向命令
  -----------------------------------------------------------------
   command > filename   把标准输出重定向到一个新文件中
   command >> filename   把标准输出重定向到一个文件中(追加)
   command 1 > filename   把标准输出重定向到一个文件中
   command > filename 2 >&1  把标准输出和标准错误一起重定向到一个文件中
   command 2 >filename   把标准错误重定向到一个文件中
   command 2 >> filename   把标准错误重定向到一个文件中(追加)
   command >> filename 2 >&1  把标准输出和标准错误一起重定向到一个文件中(追加)
   command < filename > filename2 command命令以filename文件作为标准输入,
         以filename2文件作为标准输出
   command < filename   command命令以filename文件作为标准输入
   command << delimiter   从标准输出中读入,直至遇到delimiter分界符
   command <&m    把文件描述符m作为标准输出
   command >&m    把标准输出重定向到文件描述符m中
   command <&-    关闭标准输入
  ------------------------------------------------------------------
  重定向标准输出
  eg1:
  1.把/etc/passwd文件中的用户ID域按照用户名排列。该命令重定向到sort.out文件中。
  提醒:要使用sort命令的时侯(或其他含有相似输入文件参数的命令),重定向符号一定要离开sort命令两个空格,否则该命令会把它当作输入文件
  $ cat /etc/passwd | awk -F: '{print $1}' | sort  1>sort.out
  或
  $ cat /etc/passwd | awk -F: '{print $1}' | sort  >sort.out
  eg2:
  把很多命令追加到同一个文件中
  $ ls -l | grep ^d >> files.out
  $ ls account* >> files.out
  如果想创建一个长度为0的空文件,可以用'>filename'
  $ >myfile
  重定向标准输入
  可以指定一个命令的标准输入
  $ sort  < name.txt
  sort可以直接给出相应的文件
  $ sort name.txt
  可以通过重定义为sort命令指定一个输出文件name.out
  $ sort  < name.txt > name.out
  在发送邮件时,可以用重定向的方式发送一个文件中的内容。用户louise将收到一个邮件,其中含有文件contents.txt中的内容
  $ mail louise < contents.txt
  分界符
  重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符,shell就知道输入结束了。可以自已定义分界符delimiter,最常见的是EOF
  创建一个名为myfile的文件,并在其中使用TERM和LOGNAME变量
  $ cat >> myfile <<MAYDAY
  > Hello there I am using a $TERM ternimal
  > and my user name is $LOGNAME
  > bye...
  > MAYDAY
  exec
  exec命令可以用来替代当前shell。使用这一命令时任何现在环境都会被清除,并重新启动一个shell
  形式: exec command
  exec命令的一个常见用法就是在用户的.profile最后执行时,用它来执行一些用于增强安全性的脚本










