程序员人生 网站导航

linux学习之shell脚本 ------- 输入与输出

栏目:php教程时间:2015-03-02 08:42:46
概述

顾名思义,通俗来说异常就是指,那些产生在我们本来斟酌和设定的计划以外的意外情况。

生活中总是会存在各种突发情况,如果没有做好准备,就让人措手不及。

你和朋友约好了明天1起去登山,半道上忽然乌云蔽日,下起了磅礴大雨。这就是所谓的异常情况。

你1下子傻眼了,然后看见朋友淡定的从背包里取出1件雨衣穿上,淫笑着看着你。这就是对异常的处理。

 

对1个OO程序猿来说,所做的工作就是:将需要处理的现实生活中的复杂问题,抽象出来编写成为程序。

既然现实生活中总是存在着各种突然的异常情况,那末对应其抽象出的代码,自然也是存在这样的风险的。

所以常常说:要编写1个完善的程序其实不只是简简单单的把功能实现,还要让程序具有处理在运行中可能出现的各种意外情况的能力。

这就是所谓的异常的使用。

 

体系


这就是Java当中异常体系的结构构成,从图中我们可以提取到的信息就是:

1、Java中定义的所有异常类都是内置类Throwable的子类。

 

2、Java中的异常通常被分为两大类:Error和Exception:

  • 那末顾名思义,Error代表毛病,Exception代表异常;
  • Error用以指明与运行环境相干的毛病,JVM没法从此类毛病中恢复,此类异常无需我们处理;
  • Exception代表着可以被我们所处理的异常情况,我们需要掌握和使用的,正是该类型。

3、Exception最多见的两种异常类型分别是:

  • IOException:主要是用以处理操作数据流时可能会出现的各种异常情况。
  • RuntimeException:指产生在程序运行时期的异常,如数组越界,入参不满足规范等情况引发的程序异常

 

工欲善其事,必先利其器

要理解Java中的异常使用,首先要明白几个关于异常处理的工具 - 异常处理关键字的使用。

1、throw:用以在方法内部抛出指定类型的异常。

void test(){ if(产生异常的条件){ thorw new Exception("抛出异常"); } }

2、throws:用以声明 1个方法可能产生的异常(通常都是编译时检测异常)有哪些。

void test() throws 异常1,异常2{ //这个方法可能产生异常1,异常2 throw new 异常1(); throw new 异常2();  }
3、try - catch:另外一种处理异常的方式,与throws不同的是,这类方式是指 "捕获并处理"的方式。

用try语句块包括可能产生异常的代码,catch用于捕获产生的异常,并在catch语句块中定义对捕获到的异常的处理方式。

try { //可能产生异常的代码 } catch (要捕获的异常类型 e) { //对捕获到的异常的处理方式 }
4、finally语句块:通常都是跟在try或try-catch以后进行使用,与其名字代表的1样。也就是定义终究的操作。

特点是被try语句块包括的内容中,是不是真的产生了异常。程序终究都将履行finally语句块当中的内容。

通经常使用于对资源的释放操作,例如:通过JDBC连接数据库等情况。

try { //获得资源 } catch (要捕获的异常类型 e) { //对捕获到的异常的处理方式 }finally{ //释放资源 }

趣解异常的实际使用

 

了解Java中异常类的实际利用之前,应当先了解两个概念,用以对最经常使用的异常做1个分类:

 

1、编译时被检测异常:

   只要是Exception和其子类都是,除特殊子类RuntimeException体系。

   所谓的编译时被检测异常也就是指在程序的编译器就会进行检测的异常分类。

 

   也就是说,如果1个方法抛出了1个编译时检测异常,Java则要求我们必须进行处理。

   既:通过throws对异常进行声明处理 或是 通过try-catch对异常进行捕获处理。

   如果程序编译时检测到该类异常没有被进行任何处理,那末编译器则会报出1个编译毛病。

public class Test{ public static void main(String[] args) { try { Class clazz = Class.forName("Java"); System.out.println(clazz.getName()); } catch (ClassNotFoundException e) { System.out.println("没有找到该类"); } } }

上面代码中的ClassNotFoundException就是1种编译时检测异常,这个异常是由Class类当中的forName方法所抛出并声明的。

如果我们在使用该方法时没有对异常进行处理:声明或捕获,那末该程序就会编译失败。

 

通过这个例子想要说明的是:编译时被检测异常通常都是指那些“可以被我们预感”的异常情况。

正例如:我们通过Class.forName是想要获得指定类的字节码文件对象,所以我们自然也能够预感可能会存在:

与我们传入的类名参数所对应的类字节码文件对象不存在,查找不到的情况。

既然这类意外情况是可以被预感的,那自然就应当针对其制定1些应对方案。

 

 

项目建设完成以后的结构:

前面介绍了Shell脚本的基础和运算符等,今天再来看1下关于Shell脚本的输入与输出。

项目建设完成以后的结构:

  echo

项目建设完成以后的结构:

  cat

项目建设完成以后的结构:

  tee

项目建设完成以后的结构:

Shell输入与输出的1些概念:

项目建设完成以后的结构:

  标准输入、输出和毛病

项目建设完成以后的结构:

  使用文件描写符

 

项目建设完成以后的结构:

输入输出命令的用法:

项目建设完成以后的结构:

  该命令的作用是可以显示文本行或变量,或把字条串输入到文件.

项目建设完成以后的结构:

   echo [option] string

项目建设完成以后的结构:

   - -n 回车不换行,linux系统默许回车换行

项目建设完成以后的结构:

  例子:

项目建设完成以后的结构:

#!/bin/bash #echotest echo -e "we aref testing echo command " echo -n "we are testing echo command" echo "OK" echo echo "we are testing echo command " echo "output this string to file">echo_output.txt 项目建设完成以后的结构:

jesson@jesson-HP:~/develop/workspace/shell_workspace$ chmod a+rx echotest.sh jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./echotest.sh we are testing echo command we are testing echo commandOK we are testing echo command 项目建设完成以后的结构:

  2. read

项目建设完成以后的结构:

  用法:

项目建设完成以后的结构:

   - 如果只指定1个变量,那末read将会把所有的输入赋给该变量,直至遇到第1个文件结束符或回车;如果给出了多个变量,它们按顺序分别被赋予不同的变量。shell将用空格作为变量之间的分隔符。

项目建设完成以后的结构:

readtest.sh

 

项目建设完成以后的结构:

  给予权限,履行脚本:

 

 

项目建设完成以后的结构:

  3. cat

项目建设完成以后的结构:

  用法:

项目建设完成以后的结构:

  例子:   

项目建设完成以后的结构:

  注意,cat命令是将输入的所有内容显示出来,如果需要分页显示,则可借助于管道|和more或less命令来实现。

 

 

项目建设完成以后的结构:

  可以通过管道把1个命令的输出传递给另外一个命令作为输入。

项目建设完成以后的结构:

   格式:command1 | command2

项目建设完成以后的结构:

jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l 总用量 32 -rw-rw-r-- 1 jesson jesson 25 1月 22 20:16 cattest.sh -rw-rw-r-- 1 jesson jesson 27 1月 22 19:50 echo_output.txt -rwxrwxr-x 1 jesson jesson 209 1月 22 19:50 echotest.sh -rwxrw-r-- 1 jesson jesson 94 1月 15 21:20 helloworld.sh -rwxrw-r-- 1 jesson jesson 637 1月 17 17:07 parm.sh -rwxrwxr-x 1 jesson jesson 299 1月 22 20:10 readtest.sh -rwxr-xr-x 1 jesson jesson 47 1月 17 15:21 searchfile.sh -rw-rw-r-- 1 jesson jesson 141 1月 22 20:18 shelltest.bak jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l | grep parm.sh -rwxrw-r-- 1 jesson jesson 637 1月 17 17:07 parm.sh jesson@jesson-HP:~/develop/workspace/shell_workspace$ df -k df: "/root/.gvfs": 权限不够 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda9 29525076 12915484 15109792 47% / udev 2031604 4 2031600 1% /dev tmpfs 816612 860 815752 1% /run none 5120 0 5120 0% /run/lock none 2041528 792 2040736 1% /run/shm /dev/sda10 49135432 28230216 18409268 61% /home /dev/sda1 73400952 43260784 30140168 59% /media/00006A15000514EC /dev/sda5 138424040 123913684 14510356 90% /media/00010A370001FCE2 /dev/sda6 56504040 44425044 12078996 79% /media/000E2D72000188C0 /dev/sda7 138134868 32924076 105210792 24% /media/0008EEFF00004113 jesson@jesson-HP:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}' df: "/root/.gvfs": 权限不够 文件系统 /dev/sda9 udev tmpfs none none /dev/sda10 /dev/sda1 /dev/sda5 /dev/sda6 /dev/sda7 jesson@jesson-HP:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}' | grep -v "文件系统" df: "/root/.gvfs": 权限不够 /dev/sda9 udev tmpfs none none /dev/sda10 /dev/sda1 /dev/sda5 /dev/sda6 /dev/sda7 jesson@jesson-HP:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}' | grep -v "文件系统"|grep dev df: "/root/.gvfs": 权限不够 /dev/sda9 udev /dev/sda10 /dev/sda1 /dev/sda5 /dev/sda6 /dev/sda7

项目建设完成以后的结构:

  5. tee

项目建设完成以后的结构:

  用法:

项目建设完成以后的结构:

   - 如果希望在看到输出的同时,也将其存入1个文件,那末,这个命令就最适合,-a,表示追加的意思。

项目建设完成以后的结构:

  例子:

 

项目建设完成以后的结构:

  5. exec

项目建设完成以后的结构:

  用法:

项目建设完成以后的结构:

   -其中的command通常是1个shell脚本

项目建设完成以后的结构:

输入输出的基本概念:

项目建设完成以后的结构:

  在shell中履行命令时,每一个进程都和3个打开的文件相联系,并使用文件描写符来援用这些文件,由于文件描写符不容易记,shell同时也给出了相应的文件名。

 

项目建设完成以后的结构:

文件描写符

项目建设完成以后的结构:

0(缺省是屏幕,也能够是文件)

项目建设完成以后的结构:

1(缺省是键盘,也能够是文件或其他命令的输出)

项目建设完成以后的结构:

2(

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐

1Java并发编程的艺术(六)——线程间的通信 2Java并发编程的艺术(三)——volatile 3Node核心模块之Events 4myeclipse源码相关操作 5springMVC源码分析--RequestParamMethodArgumentResolver参数解析器(三) 6Java基本数据类型总结 7java结合testng,利用XML做数据源的数据驱动示例