离开水的鱼未必不能活! 方法?-------->进化 进化进行中~~~~~~~~~~~~~

发布新日志

  • 学习是苦差事

    2008-06-26 11:27:54

    study is hard, so you must study hard.but it is also exciting when you gain. now the study is just at the beginning. in the future, study and study, in order to make myself competitive....................

  • [论坛] 圈儿圈儿小菜系列

    2008-06-21 14:22:52

    刚刚知道这里也可以贴图,索性发发我去年和今年初的作品。说来惭愧,没能持之以恒,以后要改正,不断学习新菜!哈哈

    夏日炎炎,先来凉菜
    1.凉拌金针


    凉拌金针.jpg


    2.西芹豆干


    西芹豆干.jpg


    3.泡椒凤爪


    泡椒凤爪.jpg

    4.卤鸡尖儿


    卤鸡尖儿-泡椒麻辣味.jpg
  • 今天第一阶段考试结束

    2008-06-18 20:29:30

    总体来说,感觉自己学的还不错,满通透的,当然有些地方还是需要以后在工作中学习中深入学习的,所谓学无止境么!

    今天的考试,感觉测试点没有想象的多,也相对比较简单,活用的成分比较少,多数都是概念的基本含义。不过失误还是有的,其中2处是不应该有的失误,一处代码走读一时没想起来写成code reading拉,因该是code walkthrough,另外一处是缺陷报告一时着急忘记写了状态这个要素。

    另外对于CPPUNIT的构建步骤不够熟练,只是大致了解其思想,有待加强,赫赫。其他的地方感觉答得还不错。

  • 找不到从前的感觉

    2008-06-13 20:32:15

    放学的路上下起了淅淅沥沥的小雨,不禁想起大学校园里雨中漫步的场景。同样是淅淅沥沥的小雨,宽敞的暗粉、淡黄格子相间的马路,两边是高大的梧桐,橙黄色的阔叶经过细雨的梳洗格外艳丽。一个人走在路上的感觉真的很惬意。

    而现在感觉那样的感觉真的好遥远,到处是拥挤的车辆和人流,似乎每张脸上都挂着匆忙二字,为生活,为理想而奔波。

  • 定位!position

    2008-06-12 22:28:29

    今天才正式看了 ‘用魔兽世界的语言告诉你为啥找不到工作’这个帖子,其中一句话说得很好:

    一个知道自己定位和职业定位的人,定能在团队中有出色的表现

    身为游戏中人竟然就没有在现实中悟出这样的道理,游戏可谓白玩了。所以游戏不仅是娱乐消遣,同时也是品味人生!

     

    http://bbs.51testing.com/thread-107979-1-5.html

  • 今天不想复习

    2008-06-12 21:18:24

    下周三考试,大家估计都开始系统复习了。可我却一点都不想看。偏偏对编程感兴趣,研究了一下午的Linux,发现真是太多东西可以学得啦。心急吃不成热豆腐,不能犯老错误,慢慢来。~
  • (转摘)产品开发模型IPD

    2008-06-09 14:46:05

    集成产品开发(Integrated Product Development, 简称IPD)是一套产品开发的模式、理念与方法。
    最先将IPD付诸实践的是IBM公司,后期的美国波音公司和深圳华为公司。

    IPD核心思想和框架
        .新产品开发是一项投资决策
       IPD强调要对产品开发进行有效的投资组合分析,并在开发过程设置检查点,通过阶段性评审来决定项目是继续、暂停、种植还是改变方向。
      · 基于市场的开发
       IPD强调产品创新一定是基于市场需求和竞争分析的创新。为此,IPD把正确定义产品概念、市场需求作为流程的第一步,开始就把事情做正确。
      · 跨企业、部门、跨系统的协同团队
       采用跨部门的产品开发团队(PDT:Product Development Team),通过有效的沟通、协调以及决策,达到尽快将产品推向市场的目的。
      · 异步开发模式,也称并行工程。
       就是通过严密的计划、准确的接口设计,把原来的许多后续活动提前进行,这样可以缩短产品上市时间。
      · 重用性
       采用公用构建模块(CBB:Common Building Block)提高产品开发的效率。
      · 结构化的流程
       产品开发项目的相对不确定性,要求开发流程在非结构化与过于结构化之间找到平衡。

    结构化流程

      IPD产品开发流程被明确地划分为概念、计划、开发、验证、发布、生命周期六个阶段,并且在流程中有定义清晰的决策评审点。这些评审点上的评审已不是技术评审,而是业务评审,更关注产品的市场定位及盈利情况。决策评审点有一致的衡量标准,只有完成了规定的工作才能够由一个决策点进入下一个决策点。下面是典型的产品开发流程:

      a) 在概念阶段初期,一旦IPMT认为新产品、新服务和新市场的思想有价值,他们将组建并任命PDT成员。

      b) PDT了解未来市场、收集信息、制定业务计划。业务计划主要包括市场分析、产品概述、竞争分析、生产和供应计划、市场计划、客户服务支持计划、项目时间安排和资源计划、风险评估和风险管理、财务概述等方面信息,所有这些信息都要从业务的角度来思考和确定,保证企业最终能够盈利。

      c) 业务计划完成之后,进行概念决策评审。IPMT审视这些项目并决定哪些项目可以进入计划阶段。

      d) 在计划阶段,PDT综合考虑组织、资源、时间、费用等因素,形成一个总体、详细、具有较高正确性的业务计划。

      e) 完成详细业务计划以后,PDT提交该计划给IPMT评审。如果评审通过,项目进入开发阶段。PDT负责管理从计划评审点直到将产品推向市场的整个开发过程,PDT小组成员负责落实相关部门的支持。

      f) 在产品开发全过程中,就每一活动所需要的时间及费用,不同层次人员、部门之间依次做出承诺


    产品重整

      IPD提高开发效率的手段是产品重整。产品重整主要关注于异步开发和共用基础模块(CBB)。

      1、异步开发

      异步开发模式的基本思想是将产品开发在纵向分为不同的层次,如技术层、子系统层、平台层等。不同层次工作由不同的团队并行地异步开发完成,从而减少下层对上层工作的制约,每个层次都直接面向市场。

      通常,在产品开发过程中,由于上层技术或系统通常依赖于下层的技术,因此,开发层次之间的工作具有相互依赖性,如果一个层次的工作延迟了,将会造成整个时间的延长,这是导致产品开发延误的主要原因。 通过减弱各开发层次间的依赖关系,可以实现所有层次任务的异步开发。

      为了实现异步开发,建立可重用的共用基础模块是非常重要的。

      2、共用基础模块

      共用基础模块(Common Building Blocks, CBB)指那些可以在不同产品、系统之间共用的零部件、模块、技术及其他相关的设计成果。由于部门之间共享已有成果的程度很低,随着产品种类的不断增长,零部件、支持系统、供应商也在持续增长,这将导致一系列问题。 事实上,不同产品、系统之间,存在许多可以共用的零部件、模块和技术,如果产品在开发中尽可能多地采用了这些成熟的共用基础模块和技术,无疑这一产品的质量、进度和成本会得到很好的控制和保证,产品开发中的技术风险也将大为降低。因此,通过产品重整,建立CBB数据库,实现技术、模块、子系统、零部件在不同产品之间的重用和共享,可以缩短产品开发周期、降低产品成本。 CBB策略的实施需要组织结构和衡量标准的保证。

      不管是异步开发还是共用基础模块的实现,都需要很高水平的系统划分和接口标准制订,需要企业级的构架师进行规划。

  • (转)软件开发过程模型RUP

    2008-06-09 14:33:28

    RUP的二维开发模型
      
      RUP可以用二维坐标来描述。横轴通过时间组织,是过程展开的生命周期特征,体现开发过程的动态结构,用来描述它的术语主要包括周期(Cycle)、阶段(Phase)、迭代(Iteration)和里程碑(Milestone);纵轴以内容来组织为自然的逻辑活动,体现开发过程的静态结构,用来描述它的术语主要包括活动(Activity)、产物(Artifact)、工作者(Worker)和工作流(Workflow)。如图1:
      
     
      图1 RUP的二维开发模型

      
    开发过程中的各个阶段和里程碑
      
      RUP中的软件生命周期在时间上被分解为四个顺序的阶段,分别是:初始阶段(Inception)、细化阶段(Elaboration)、构造阶段(Construction)和交付阶段(Transition)。每个阶段结束于一个主要的里程碑(Major Milestones);每个阶段本质上是两个里程碑之间的时间跨度。在每个阶段的结尾执行一次评估以确定这个阶段的目标是否已经满足。如果评估结果令人满意的话,可以允许项目进入下一个阶段。
      
      1.初始阶段
      
      初始阶段有时也称先启阶段。初始阶段的目标是为系统建立商业案例并确定项目的边界。为了达到该目的必须识别所有与系统交互的外部实体,在较高层次上定义交互的特性。本阶段具有非常重要的意义,在这个阶段中所关注的是整个项目进行中的业务和需求方面的主要风险。对于建立在原有系统基础上的开发项目来讲,初始阶段可能很短。
      
      初始阶段结束时是第一个重要的里程碑:生命周期目标(Lifecycle Objective)里程碑。生命周期目标里程碑评价项目基本的生存能力。
      
      2.细化阶段
      
      细化阶段的目标是分析问题领域,建立健全的体系结构基础,编制项目计划,淘汰项目中最高风险的元素。为了达到该目的,必须在理解整个系统的基础上,对体系结构作出决策,包括其范围、主要功能和诸如性能等非功能需求。同时为项目建立支持环境,包括创建开发案例,创建模板、准则并准备工具。
      
      细化阶段结束时第二个重要的里程碑:生命周期结构(Lifecycle Architecture)里程碑。生命周期结构里程碑为系统的结构建立了管理基准并使项目小组能够在构建阶段中进行衡量。此刻,要检验详细的系统目标和范围、结构的选择以及主要风险的解决方案。
      
      3.构造阶段
      
      在构建阶段,所有剩余的构件和应用程序功能被开发并集成为产品,所有的功能被详细测试。从某种意义上说,构建阶段是一个制造过程,其重点放在管理资源及控制运作以优化成本、进度和质量。
      
      构建阶段结束时是第三个重要的里程碑:初始功能(Initial Operational)里程碑。初始功能里程碑决定了产品是否可以在测试环境中进行部署。此刻,要确定软件、环境、用户是否可以开始系统的运作。此时的产品版本也常被称为“beta”版。
      
      4.交付阶段
      
      交付阶段的重点是确保软件对最终用户是可用的。交付阶段可以跨越几次迭代,包括为发布做准备的产品测试,基于用户反馈的少量的调整。在生命周期的这一点上,用户反馈应主要集中在产品调整,设置、安装和可用性问题,所有主要的结构问题应该已经在项目生命周期的早期阶段解决了。
      
      在交付阶段的终点是第四个里程碑:产品发布(Product Release)里程碑。此时,要确定目标是否实现,是否应该开始另一个开发周期。在一些情况下这个里程碑可能与下一个周期的初始阶段的结束重合。
      
    RUP的核心工作流(Core Workflows)
      
      RUP中有9个核心工作流,分为6个核心过程工作流(Core Process Workflows)和3个核心支持工作流(Core Supporting Workflows)。尽管6个核心过程工作流可能使人想起传统瀑布模型中的几个阶段,但应注意迭代过程中的阶段是完全不同的,这些工作流在整个生命周期中一次又一次被访问。9个核心工作流在项目中轮流被使用,在每一次迭代中以不同的重点和强度重复。
      
      1.商业建模(Business Modeling)
      
      商业建模工作流描述了如何为新的目标组织开发一个构想,并基于这个构想在商业用例模型和商业对象模型中定义组织的过程,角色和责任。
      
      2.需求(Requirements)
      
      需求工作流的目标是描述系统应该做什么,并使开发人员和用户就这一描述达成共识。为了达到该目标,要对需要的功能和约束进行提取、组织、文档化;最重要的是理解系统所解决问题的定义和范围。
      
      3.分析和设计(Analysis & Design)
      
      分析和设计工作流将需求转化成未来系统的设计,为系统开发一个健壮的结构并调整设计使其与实现环境相匹配,优化其性能。分析设计的结果是一个设计模型和一个可选的分析模型。设计模型是源代码的抽象,由设计类和一些描述组成。设计类被组织成具有良好接口的设计包(Package)和设计子系统(Subsystem),而描述则体现了类的对象如何协同工作实现用例的功能。
      
      设计活动以体系结构设计为中心,体系结构由若干结构视图来表达,结构视图是整个设计的抽象和简化,该视图中省略了一些细节,使重要的特点体现得更加清晰。体系结构不仅仅是良好设计模型的承载媒介,而且在系统的开发中能提高被创建模型的质量。
      
      4.实现(Implementation)
      
      实现工作流的目的包括以层次化的子系统形式定义代码的组织结构;以组件的形式(源文件、二进制文件、可执行文件)实现类和对象;将开发出的组件作为单元进行测试以及集成由单个开发者(或小组)所产生的结果,使其成为可执行的系统。
      
      5.测试(Test)
      
      测试工作流要验证对象间的交互作用,验证软件中所有组件的正确集成,检验所有的需求已被正确的实现, 识别并确认缺陷在软件部署之前被提出并处理。RUP提出了迭代的方法,意味着在整个项目中进行测试,从而尽可能早地发现缺陷,从根本上降低了修改缺陷的成本。测试类似于三维模型,分别从可靠性、功能性和系统性能来进行。
      
      6.部署(Deployment)
      
      部署工作流的目的是成功的生成版本并将软件分发给最终用户。部署工作流描述了那些与确保软件产品对最终用户具有可用性相关的活动,包括:软件打包、生成软件本身以外的产品、安装软件、为用户提供帮助。在有些情况下,还可能包括计划和进行beta测试版、移植现有的软件和数据以及正式验收。
      
      7.配置和变更管理(Configuration & Change Management)
      
      配置和变更管理工作流描绘了如何在多个成员组成的项目中控制大量的产物。配置和变更管理工作流提供了准则来管理演化系统中的多个变体,跟踪软件创建过程中的版本。工作流描述了如何管理并行开发、分布式开发、如何自动化创建工程。同时也阐述了对产品修改原因、时间、人员保持审计记录。
      
      8.项目管理(Project Management)
      
      软件项目管理平衡各种可能产生冲突的目标,管理风险,克服各种约束并成功交付使用户满意的产品。其目标包括:为项目的管理提供框架,为计划、人员配备、执行和监控项目提供实用的准则,为管理风险提供框架等。
      
      9.环境(Environment)
      
      环境工作流的目的是向软件开发组织提供软件开发环境,包括过程和工具。环境工作流集中于配置项目过程中所需要的活动,同样也支持开发项目规范的活动,提供了逐步的指导手册并介绍了如何在组织中实现过程。
      
    RUP的迭代开发模式
      
      RUP中的每个阶段可以进一步分解为迭代。一个迭代是一个完整的开发循环,产生一个可执行的产品版本,是最终产品的一个子集,它增量式地发展,从一个迭代过程到另一个迭代过程到成为最终的系统。
      
      传统上的项目组织是顺序通过每个工作流,每个工作流只有一次,也就是我们熟悉的瀑布生命周期。这样做的结果是到实现末期产品完成并开始测试,在分析、设计和实现阶段所遗留的隐藏问题会大量出现,项目可能要停止并开始一个漫长的错误修正周期。
      
     
      图2 RUP的迭代开发模式

      
      一种更灵活,风险更小的方法是多次通过不同的开发工作流,这样可以更好的理解需求,构造一个健壮的体系结构,并最终交付一系列逐步完成的版本。
  • 复习方法,你知几许~~

    2008-06-07 11:13:39

       昨天qq群里小宋老师提醒我们要准备复习了,快要考试喽。。于是突然想起论坛里很多师兄师姐们发复习提纲,于是有些许想法,准备写下来供大家参考。
        首先我要提醒,你要在我这里找复习资料的话,那你就不用往下看了,提前告诉你我没有任何复习资料可以给你看,你要复习的在你的脑子里. 什么,在脑子里?你在说什么废话?哈哈,I'm sure, it's in your mind!!
       ok,开始展开我的复习方法吧!我现在基本没有什么回头看书的时间,一直在利用课后时间上课还有学习其他的东西,当然了,主要是编程语言,没办法,以前学的都忘记了,刚刚花了20天把C搞定(当然是可以自由编写不是很复杂的程序的程度,至少谭浩强的课后习题95%都作出来),现在又在搞shell学习,我感觉shell编程语法结构并不难,难得是你怎样在最短时间内(4 days)把正则表达和各种参数运用自如。所以复习的时间恐怕只有在30分钟的地铁上和上厕所的时间拉(娃哈哈,有点不好意思啊!)
        难道你是天才?可以用这么短的时间来复习?骗鬼去吧!!!娃哈哈,首先说我不是天才,我的记忆能力也比较差劲,但我的确做到可以利用上厕所的10分钟内把所学的复习个大概。方法就是自由展开你的思路,随意回想。可能我昨天早上突然不自觉地想到了质量的东西,于是思维就自然跳到了那个模型,想到了模型,又想到了他是测试的参考,那么就想到了测试的依据,等等等。没事你就利用你那没睡醒的大脑去想吧,这样你已经在不自觉中复习了你学过的东西。
        当然了,上面提到的是你平时可以'废品利用',这个品就是基本不能做什么事情的时间段。这个比喻不大贴切,艾,没办法,我的语言造诣实在太差,你就将就着理解吧!时间已经过去了,恐怕我们谁有没有能力把过去的时间拿回来作回想(不知道这辈子有没有哪个科学家什么的发明出来时空穿梭机,好像小时后就知道这个名词了),那么就看现在开始的时间内剔除你还要上课和课外学习的时间(对于我来说好像也不多o)怎么样来复习。
        重头开始翻书看笔记?大错而特错,简直是浪费时间和脑系胞。为什么?因为这样你都不知道自己到底哪些地方薄弱,哪些地方掌握的比较牢固,这样的复习方法相当于把时间平均分配,造成薄弱的地方没有花更多心思去理解。所以东西你是都看到了,这只能证明你知道有这个东西,可是你对它了解有多少,恐怕你都没有思考过。所以我的建议是。所有的书都先撇到一边去,开始闭目养神吧!
        人的大脑是无时无刻不在运转,所以你不去让它想一个事物,那么它就会想其他的,可能一会是电影啊,一会是新闻阿,一会是八卦阿等等等,那么你就把它拽回来让它想你所想吧。
        我们将来做的是测试行业,那么就从头开始想,什么是测试,怎样展开测试。测试的展开不能一蹴而就,所以你要分段来,那么每段的划分你就要有个标准,不能说我想什么时候进下一段我就进下一段对巴。既然分段了,你就要想我用什么方法来完成每一段的测试任务。有了方法,你还得有测试范围的参考和测试的依据,总部能胡乱来测吧。那么依据当然是你在每段中要先作出来的,作出来了自然要经过基线化才能有效。那么范围的参考呢,自然就联想到了质量模型,想到此,你就自然开始回想给质量怎么定性,它有不同的层次,关键的铁三角,三角中过程尤为重要,它联系着组织和技术,那么过程的决定因素又有哪些?你就去回想吧。质量也是有业界标准的,那么自然就想起来了iso,cmm/cmmi,6sigma。既然都能考量质量,那么自然各有所长 喽,cmm和cmmi就差那么小小的一个字母i,可实际的意义又有多大的区别呢?想吧!!
       ok,前期的东西你基本想完了,那么是不是要开始展开实践部分的回想,怎么写好一个测试plan和case,要注意哪些重点和内容。case也想完了,自然就想到了测试执行了,于是想到了那个 QC工具,对于这个qc你有多少了解,宋老师对工具的历史可是有介绍的,那么怎么运用这个工具,它常用的模块有哪些。上面有个defect模块吧,是不是让你想起来缺陷管理了?那么一个缺陷管理的流程怎样?你不需要回想书上的那个flow chart,你就把自己置身于一个开发的team(包括RD和测试)中,什么情况下会发现bug,怎么提交,提交后要经过 审核吧,审核后的处理方式,其中一种方式需要rd来fix吧,那么那么rdfix了还需要验证吧,ok了就关了,没ok就继续reopen,重返这个流程,就这么简单的思路(当然实际工作中可没你想得这么简单).
       那么之后我们是否要研究下每个测试阶段的测试策略问题,单元的三个,集成的10个,前4个重点掌握,前2大类要全理解,第三类知道他的特点就可以。系统的还没开始学,后面还有配置管理及配置管理工具,同样的还是用回想法了。
       当然,当你想到一些地方感觉有点模糊了,那就记下来。回想完毕,那么把你的书翻到大纲那一页,看是不是还有没想到的,有的话继续想。。之后再翻番书看看笔记来研究下你回想中感到模糊的地方。对于sql阿,linux阿,重要的还是你的动手能力,我真不觉得你能多背几个命令就代表尼掌握的很好,重要的是你会用,而且命令么,这么发达的网络和参考手册,随时index一下就ok了,所以对于考试来说,我个人觉得靠笔试真的也有些没劲,可是我也提不出什么好的考核方法,赫赫,毕竟考核时间有限吗,哈哈。。再则,这些东西老师教的只是一点皮毛,把你领进门的事情,重要的还是你工作中不断的应用和查阅拉。知识博大精深的很~~
      到现在,复习可以算完毕了,你花多久时间来完成这样的复习?我,一天足够了,包括上机熟悉一下命令什么的。可能有人会说我想不到啊,或者我想到了,可是都概念不清阿。阿哦,我只能很抱歉的说,你上课没有注意听,或者你根本没有理解的听。注意听不是说你认真地听老师讲概念的每一个字,而是听他对这个概念的剖析和举例,抽象的东西就算你今天背下来了,过个一个月估计你脑子里没东西了,或者考完试你就大脑空白了。若你说考试这几天我记住不久好了,那我真想告诉你,你还是别来学了,浪费你的那么多学费阿。考试只是用来衡量或者督促你学习,学习是为了减少工作中的绊脚石,而非仅仅为了应付一次面试,那若你将来再面试怎么办?难道还要再把现在的教材拿起来背一遍!?若你就是为了考试通过,那你就是一个纯纯翠翠的学生!!鉴定完毕!!!

       ok,now feel free to open your mind!!

  • 续5:正规表示法 RE(本文为转载,仅供学习参考)

    2008-06-07 00:00:03

    格式化列印: printf

    在很多时候,我们可能需要将输出的数据给他格式化输出的~ 举例来说,考试卷分数的输出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧?例如我想要输出底下的样式:

    Name     Chinese   English   Math    Average

    DmTsai        80        60     92      77.33

    VBird         75        55     80      70.00

    Ken           60        90     70      73.33

    分成五个字段,各个字段分配到正确的位置去!但是因为每个字段的原始数据其实并非是如此固定的,而我就是想要如此表示出这些数据,此时,就得需要打印格式管理员 printf 的帮忙了! printf 可以帮我们将资料输出的结果格式化,而且而支持一些特殊的字符~底下我们就来看看!

    [root@linux ~]# printf '打印格式' 实际内容

    参数:

    关于格式方面的几个特殊样式:

           \a    警告声音输出

           \b    退格键(backspace)

           \f    清除屏幕 (form feed)

           \n    输出新的一行

           \r    亦即 Enter 按键

           \t    水平的 [tab] 按键

           \v    垂直的 [tabl] 按键

           \xNN  NN 为两位数的数字,可以转换数字成为字符。

    关于 C 程序语言内,常见的变数格式

           %ns   那个 n 是数字, s 代表 string ,亦即多少个字符;

           %ni   那个 n 是数字, i 代表 integer ,亦即多少整数字数;

           %N.nf 那个 n N 都是数字, f 代表 floating (浮点),如果有小数字数,

                 假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!

    范例:

     

    范例一:将刚刚上头的数据变成档案,仅列出姓名与成绩:( [tab] 分隔

    [root@linux ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' `cat printf.txt`

    Name     Chinese         English         Math    Average

    DmTsai   80      60      92      77.33

    VBird    75      55      80      70.00

    Ken      60      90      70      73.33

    # 假设我将上面的档案存成 printf.txt 档案档名,则可利用上面的案例,

    # 将每个单字中间以 [tab] 按键隔开。由上面的输出来看,虽然第二行以后是 OK 的,

    # 但是第一行则因为某些单字长度较长,所以就无法对齐了!而 %s 表示以字符串 (string)

    # 的方式来展现该内容。而每个内容则以 \t [tab] 来隔开啊!

     

    范例二:将上述资料关于第二行以后,分别以字符串、整数、小数点来显示:

    [root@linux ~]# printf '%10s %5i %5i %5i %8.2f \n' `cat printf.txt |\

    > grep -v Name`

        DmTsai    80    60    92    77.33

         VBird    75    55    80    70.00

           Ken    60    90    70    73.33

    # 这个时候的输出可就有趣了!我将几个内容分成不同的数据格式来输出,

    # 最有趣的应该是 %8.2f 这个项目了!我可以针对不同的小数字数来进行格式输出,

    # 例如变成底下的样子时,您自己试看看,会是输出什么结果喔!

    # printf '%10s %5i %5i %5i %8.1f \n' `cat printf.txt | grep -v Name`

     

    范例三:列出数值 45 代表的字符为何?

    [root@linux ~]# printf '\x45\n'

    E

    # 这东西也很好玩~他可以将数值转换成为字符,如果您会写 scrīpt 的话,

    # 可以自行测试一下,由 20~80 之间的数值代表的字符是啥喔! ^_^

    printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程序语言当中使用的屏幕输出, 都是利用 printf
  • 续4:正规表示法 RE(本文为转载,仅供学习参考)

    2008-06-06 23:58:19

    延伸正规表示法

    事实上,一般读者只要了解基础型的正规表示法大概就已经相当足够了,不过,某些时刻, 为了要简化整个指令操作,了解一下使用范围更广的延伸型正规表示法的表示式,会更方便呢!举个简单的例子好了,在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列, 使用的是

    grep -v '^$' regular_express.txt | grep -v '^#'

    需要使用到管线命令来搜寻两次! 那么如果使用延伸型的正规表示法,我们可以简化为:

    egrep -v '^$|^#' regular_express.txt

    利用支持延伸型正规表示法的 egrep 与特殊字符 | 来区隔两组字符串,如此一来,是否方便很多呢?

    这里必须要特别强调, grep 支持的是基础型的正规表示法,而 egrep 支持延伸正规表示法。 事实上, egrep grep -E 的命令别名,为了方便使用,我们还是以 egrep 来跟 grep 区分吧!

    熟悉了正规表示法之后,到这个延伸型的正规表示法,您应该也会想到, 不就是多几个重要的特殊符号吗? ^_^y 是的~所以,我们就直接来说明一下,延伸型正规表示法有哪几个特殊符号?

    RE 字符

    意义与范例

    +

    重复『一个或一个以上』的前一个 RE 字符

    范例:egrep -n 'go+d' regular_express.txt
    搜寻 (god) (good) (goood)... 等等的字符串。 那个 o+ 代表『一个以上的 o 』所以,上面的执行成果会将第 1, 9, 13 行列出来。

    ?

    『零个或一个』的前一个 RE 字符

    范例:egrep -n 'go?d' regular_express.txt
    搜寻 (gd) (god) 这两个字符串。 那个 o? 代表『空的或 1 o 』所以,上面的执行成果会将第 13, 14 行列出来。
    有没有发现到,这两个案例( 'go+d' 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^

    |

    用或( or )的方式找出数个字符串

    范例:egrep -n 'gd|good' regular_express.txt
    搜寻 gd good 这两个字符串,注意,是『或』! 所以,第 1,9,14 这三行都可以被打印出来喔!那如果还想要找出 dog 呢?就这样啊:
    egrep -n 'gd|good|dog' regular_express.txt

    ( )

    找出『群组』字符串

    范例:egrep -n 'g(la|oo)d' regular_express.txt
    搜寻 (glad) (good) 这两个字符串,因为 g d 是重复的,所以, 我就可以将 la oo 列于 ( ) 当中,并以 | 来分隔开来,就可以啦!
    此外,这个功能还可以用来作为『多个重复群组』的判别喔!举例来说:
    echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
    上面的例子当中,意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字符串的意思~

     


    以上这些就是延伸型的正规表示法的特殊字符。另外,要特别强调的是,那个 ! 在正规表示法当中并不是特殊字符, 所以,如果您想要查出来档案中含有 ! > 的字行时,可以这样:

    grep -n '[!>]' regular_express.txt

    这样可以了解了吗?!常常看到有陷阱的题目写:『反向选择这样对否? '[!a-z]'?』, 呵呵!是错的呦~要 '[^a-z] 才是对的!
  • 续3:正规表示法 RE(本文为转载,仅供学习参考)

    2008-06-06 23:56:36

    • 例题五、限定连续 RE 字符范围 {}
      在上个例题当中,我们可以利用 . RE 字符及 * 来设定 0 个到无限多个重复字符, 那如果我想要限制一个范围区间内的重复字符数呢?举例来说,我想要找出两个到五个 o 的连续字符串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用跳脱字符 \ 来让他失去特殊意义才行。

      至于 {} 的语法是这样的,假设我要找到两个 o 的字符串,可以是:

    [root@test root]# grep -n 'o\{2\}' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    2:apple is my favorite food.

    3:Football game is not use feet only.

    9:Oh! The soup taste good.

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    这样看似乎与 ooo* 的字符没有什么差异啊?因为第 19 行有多个 o 依旧也出现了! 好,那么换个搜寻的字符串,假设我们要找出 g 后面接 2 5 o ,然后再接一个 g 的字符串, 他会是这样:

    [root@test root]# grep -n 'go\{2,5\}g' regular_express.txt

    18:google is the best tools for search keyword.

    嗯!很好!第 19 行终于没有被取用了(因为 19 行有 6 o 啊!) 那么,如果我想要的是 2 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:

    [root@test root]# grep -n 'go\{2,\}g' regular_express.txt

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    呵呵!就可以找出来啦~

    重要特殊字符(characters)

    经过了上面的几个简单的范例,我们可以将基础的正规表示法特殊字符汇整如下:

    RE 字符

    意义与范例

    ^word

    待搜寻的字符串(word)在行首!

    范例:grep -n '^#' regular_express.txt
    搜寻行首为 # 开始的那一行!

    word$

    待搜寻的字符串(word)在行尾!

    范例:grep -n '!$' regular_express.txt
    将行尾为 ! 的那一行打印出来!

    .

    代表『任意一个』字符,一定是一个任意字符!

    范例:grep -n 'e.e' regular_express.txt
    搜寻的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e e 中间『一定』仅有一个字符,而空格符也是字符!

    \

    跳脱字符,将特殊符号的特殊意义去除!

    范例:grep -n \' regular_express.txt
    搜寻含有单引号 ' 的那一行!

    *

    重复零个或多个的前一个 RE 字符

    范例:grep -n 'ess*' regular_express.txt
    找出含有 (es) (ess) (esss) 等等的字符串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字符串。另外,因为 * 为重复『前一个 RE 字符』的符号, 因此,在 * 之前必须要紧接着一个 RE 字符喔!例如任意字符则为 『.*』 !

    \{n,m\}

    连续 n m 个的『前一个 RE 字符』
    若为 \{n\} 则是连续 n 个的前一个 RE 字符,
    若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符!

    范例:grep -n 'go\{2,3\}g' regular_express.txt
    g g 之间有 2 个到 3 个的 o 存在的字符串,亦即 (goog)(gooog)

    []

    字符集合的 RE 特殊字符的符号

    [list]
    范例:grep -n 'g[ld]' regular_express.txt
    搜寻含有 (gl) (gd) 的那一行~
    需要特别留意的是,在 [] 当中『谨代表一个待搜寻的字符』,
    例如: a[afl]y 代表搜寻的字符串可以是 aay, afy, aly
    亦即 [afl] 代表 a f l 的意思!

    [ch1-ch2]
    范例:grep -n '[0-9]' regular_express.txt
    搜寻含有任意数字的那一行!需特别留意,在字符集合 [] 中的减号 - 是有特殊意义的,他代表两个字符之间的所有连续字符!但这个连续与否与 ASCII 编码有关, 因此,您的编码需要设定正确( bash 当中,需要确定 LANG LANGUAGE 的变量是否正确!) 例如所有大写字符则为 [A-Z]

    [^]
    范例:grep -n 'oo[^t]' regular_express.txt
    搜寻的字符串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ [] 内时, 代表的意义是『反向选择』的意思~例如,我不要大写字符,则为 [^A-Z] 但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻, 却发现该档案内的所有行都被列出,为什么?因为这个 [^A-Z] 是『非大写字符』的意思, 因为每一行均有非大写字符,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字符, 以及双引号 (") 等字符,所以当然符合 [^A-Z] 的搜寻!

  • 续2:正规表示法 RE(本文为转载,仅供学习参考)

    2008-06-06 23:54:07

    • 例题三、行首与行尾字符 ^ $
      我们在例题一当中,可以查询到一行字符串里面有 the 的,那如果我想要让 the 只在行首列出呢? 这个时候就得要使用定位字符了!我们可以这样做:

    [root@test root]# grep -n '^the' regular_express.txt

    12:the symbol '*' is represented as start.

    此时,就只剩下第 12 行,因为只有第 12 行的行首是 the 开头啊~此外, 如果我想要开头是小写字符的那一行就列出呢?可以这样:

    [root@test root]# grep -n '^[a-z]' regular_express.txt

    2:apple is my favorite food.

    4:this dress doesn't fit me.

    10:motorcycle is cheap than car.

    12:the symbol '*' is represented as start.

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    如果我不想要开头是英文字母,则可以是这样:

    [root@test root]# grep -n '^[^a-zA-Z]' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    20:# I am VBird

    注意到了吧?那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的! [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!要分清楚喔!

    那如果我想要找出来,行尾结束为小数点 (.) 的那一行,该如何处理:

    [root@test root]# grep -n '\.$' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    2:apple is my favorite food.

    3:Football game is not use feet only.

    4:this dress doesn't fit me.

    10:motorcycle is cheap than car.

    11:This window is clear.

    12:the symbol '*' is represented as start.

    15:You are the best is mean you are the no. 1.

    16:The world  is the same with "glad".

    17:I like dog.

    18:google is the best tools for search keyword.

    特别注意到,因为小数点具有其它意义(底下会介绍),所以必须要使用跳脱字符(\)来加以解除其特殊意义! 不过,您或许会觉得奇怪,但是第 5~9 行最后面也是 . 啊~怎么无法打印出来?? 这里就牵涉到 Windows 平台的软件对于断行字符的判断问题了!我们使用 cat -A 将第五行拿出来看, 您会发现:

    [root@test root]# cat -A regular_express.txt

    However, this dress is about $ 3183 dollars.^M$

    注意到了没?最后面的断行字符应该是 $ 才对,但是,因为 Windows nodepad 会主动加上 ^M 作为断行的判断,因此,那个 . 自然就不是紧接在 $ 之前喔!这样可以了解 ^ $ 的意义吗? 好了,先不要看底下的解答,自己想一想,那么如果我想要找出来,哪一行是『空白行』, 也就是说,该行并没有输入任何数据,该如何搜寻??

    [root@test root]# grep -n '^$' regular_express.txt

    21:

    因为只有行首跟行尾( ^$ ),所以,这样就可以找出空白行啦!再来, 假设您已经知道在一个批次脚本 (shell scrīpt) 或者是设定档当中, 空白行与开头为 # 的那一行是批注,因此如果您要将资料列出给别人参考时, 可以将这些数据省略掉,以节省保贵的纸张,那么,您可以怎么作呢? 我们以 /etc/syslog.conf 这个档案来作范例,您可以自行参考一下输出的结果:

    [root@test root]# cat /etc/syslog.conf

    [root@test root]# grep -v '^$' /etc/syslog.conf | grep -v '^#'

     

    • 例题四、任意一个字符 . 与重复字符 *
      bash 的章节当中,我们知道万用字符 * 可以用来代表任意(0或多个)字符, 但是正规表示法并不是万用字符,两者之间是不相同的! 至于正规表示法当中的『 . 』则代表『绝对有一个任意字符』的意思!这样讲不好懂, 我们直接做个练习吧!假设我需要找出 g??d 的字符串,亦即共有四个字符, 起头是 g 而结束是 d ,我可以这样做:

    [root@test root]# grep -n 'g..d' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    9:Oh! The soup taste good.

    16:The world  is the same with "glad".

    因为强调 g d 之间一定要存在两个字符,因此,第 13 行的 god 与第 14 行的 gd 就不会被列出来啦!再来,如果我想要列出有 oo, ooo, oooo 等等的数据, 也就是说,至少要有两个 o 以上,该如何是好??是 o* 还是 oo* 还是 ooo* 呢? 虽然您可以试看看结果, 不过结果太占版面了 @_@ ,所以,我这里就直接说明。

    因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有空字符或一个 o 以上的字符』, 特别注意,因为允许空字符(就是有没有字符都可以的意思),因此, grep -n 'o*' regular_express.txt 将会把所有的数据都打印出来屏幕上!

    那如果是『oo*』呢?则第一个 o 肯定必须要存在,第二个 o 则是可有可无的多个 o 所以,凡是含有 o, oo, ooo, oooo 等等,都可以被列出来~

    同理,当我们需要『至少两个 o 以上的字符串』时,就需要 ooo* ,亦即是:

    [root@test root]# grep -n 'ooo*' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    2:apple is my favorite food.

    3:Football game is not use feet only.

    9:Oh! The soup taste good.

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    这样理解 * 的意义了吗?!好了,现在出个练习,如果我想要字符串开头与结尾都是 g 但是两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等, 那该如何?

    [root@test root]# grep -n 'goo*g' regular_express.txt

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    如此了解了吗?好,再来一题,如果我想要找出 g

  • 续1:正规表示法 RE(本文为转载,仅供学习参考)

    2008-06-06 23:52:27

    • 例题二、利用 [] 来搜寻集合字符
      如果我想要搜寻 test taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在~这个时候,我可以这样来搜寻:

    [root@test root]# grep -n 't[ae]st' regular_express.txt

    8:I can't finish the test.

    9:Oh! The soup taste good.

    了解了吧?其实 [] 里面不论有几个字符,他都谨代表某『一个』字符, 所以,上面的例子说明了,我需要的字符串是『tast』或『test』两个字符串而已! 而如果想要搜寻到有 oo 的字符时,则使用:

    [root@test root]# grep -n 'oo' regular_express.txt

    1:"Open Source" is a good mechanism to develop programs.

    2:apple is my favorite food.

    3:Football game is not use feet only.

    9:Oh! The soup taste good.

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    但是,如果我不想要 oo 前面有 g 的话呢?此时,可以利用在集合字符的反向选择 [^] 来达成

    [root@test root]# grep -n '[^g]oo' regular_express.txt

    2:apple is my favorite food.

    3:Football game is not use feet only.

    18:google is the best tools for search keyword.

    19:goooooogle yes!

    意思就是说,我需要的是 oo ,但是 oo 前面不能是 g 就是了! 仔细比较上面两个表格,妳会发现,第 1,9 行不见了,因为 oo 前面出现了 g 所致! 2,3 行没有疑问,因为 foo Foo 均可被接受!但是第 18 行明明有 google goo 啊~ 别忘记了,因为该行后面出现了 tool too 啊!所以该行也被列出来~ 也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由于有需要的项目 (too) 因此,是符合字符串搜寻的喔!

    至于第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,这一行也是符合需求的!

    再来,假设我 oo 前面不想要有小写字符,所以,我可以这样写 [^abcd....z]oo 但是这样似乎不怎么方便,由于小写字符的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下这样:

    [root@test root]# grep -n '[^a-z]oo' regular_express.txt

    3:Football game is not use feet only.

    也就是说,当我们在一组集合字符中,如果该字符组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字符串是数字与英文呢? 呵呵!就将他全部写在一起,变成:[a-zA-Z0-9]

    例如,我们要取得有数字的那一行,就这样:

    [root@test root]# grep -n '[0-9]' regular_express.txt

    5:However, this dress is about $ 3183 dollars.

    15:You are the best is mean you are the no. 1.

    这样对于 [] 以及 [^] 以及 [] 当中的 - 有了解了吗?! ^_^y

  • 正规表示法 Regular Expression, RE(本文为转载,仅供学习参考)

    2008-06-06 23:50:51

    学好shell编程,打好基础才是重要,今天上点正则表示法的小菜~~~

    ------------------------------------------------------------------------------------

    正规表示法与万用字符是不一样的东西! 这很重要喔!因为万用字符 (wildcard) 所代表的意义与正规表示法并不相同~ 例如,在万用字符当中,* 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复 0 到多个的前一个 RE 字符的意思~使用的意义并不相同要分的很清楚才行

    举例来说,不支持正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』 代表的是任意檔名的档案,而 『ls -l a* 』代表的是以 a 为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头的档案,则必须要这样:(需搭配支持正规表示法的工具)

    ls | grep -n '^a.*'

    另外,例如万用字符的反向选择,为 [!range] ,至于正规表示法则是 [^range] 。 这样是否了解正规表示法与万用字符的差异啦??

    基础正规表示法

    既然正规表示法是处理字符串的一个标准表示方式,他需要支持的工具程序来辅助, 所以,我们这里就先介绍一个最简单的字符串撷取功能的工具程序,那就是 grep 啰! 在介绍完 grep 的基本功能之后,就进入正规表示法的特殊字符的处理能力了。


    grep 撷取字符串

    既然要使用 grep 当然就得要先了解一下 grep 的语法啰~

    [root@test root]# grep [-acinv] '搜寻字符串' filename

    参数说明:

    -a :将 binary 档案以 text 档案的方式搜寻数据

    -c :计算找到 '搜寻字符串' 的次数

    -i :忽略大小写的不同,所以大小写视为相同

    -n :顺便输出行号

    -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

    我们就开始以 grep 来进行正规表示法的简易说明吧!我们先以底下这个档案来作为范例:

    [root@test root]# vi regular_express.txt
    "Open Source" is a good mechanism to develop programs.
    apple is my favorite food.
    Football game is not use feet only.
    this dress doesn't fit me.
    However, this dress is about $ 3183 dollars.
    GNU is free air not free beer.
    Her hair is very beauty.
    I can’t finish the test.
    Oh! The soup taste good.
    motorcycle is cheap than car.
    This window is clear.
    the symbol '*' is represented as start.
    Oh! My god!
    The gd software is a library for drafting programs.
    You are the best is mean you are the no. 1.
    The world is the same with "glad".
    I like dog.
    google is the best tools for search keyword.
    goooooogle yes!
    go! go! Let's go.
    # I am VBird

    因为不同的语系编码是不一样的,所以,您必须要将语系改成英文语系, 才能够进行底下的测试,否则,可能会有显示的内容与底下的输出不符的状况喔! 修改语系的方法为:

    [root@test root]# LANG=en

    [root@test root]# export LANG

    • 例题一、搜寻特定字符串:[] 以及 [^]
      搜寻特定字符串很简单吧?假设我们要从刚刚的档案当中取得 the 这个特定字符串, 最简单的方式就是这样:

    [root@test root]# grep -n 'the' regular_express.txt

    8:I can't finish the test.

    12:the symbol '*' is represented as start.

    15:You are the best is mean you are the no. 1.

    16:The world  is the same with "glad".

    18:google is the best tools for search keyword.

    那如果想要『反向选择』呢?也就是说,当该行没有 'the' 这个字符串时,才显示在屏幕上,那就直接使用:

    [root@test root]# grep -vn 'the' regular_express.txt

    您会发现,屏幕上出现的行列为除了 8,12,15,16,18 五行之外的其它行列! 接下来,如果您想要取得不论大小写的 the 这个字符串,则:

    [root@test root]# grep -in 'the' regular_express.txt

    8:I can't finish the test.

    9:Oh! The soup taste good.

    12:the symbol '*' is represented as start.

    14:The gd software is a library for drafting programs.

    15:You are the best is mean you are the no. 1.

    16:The world  is the same with "glad".

    18:google is the best tools for search keyword.

     

  • 续4:Linux shell初体验-变量(本文为转载,仅供学习参考)

    2008-06-05 22:54:35

    变量键盘读取、数组与宣告: read, array, declare

    我们上面提到的变量设定功能,都是直接由指令列直接设定的,那么,可不可以让使用者能够经由键盘输入? 什么意思呢?是否记得某些程序执行的过程当中,会等待使用者输入 "yes/no" 之类的讯息啊!? bash 里面也有相对应的功能喔!此外,我们还可以宣告这个变量的属性, 例如:数组或者是数字等等的。底下就来看看吧!


      read

    要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell scrīpt 的撰写当中, 以跟使用者进行对谈。关于 scrīpt 的写法,我们会在后面章节介绍,底下先来瞧一瞧 read 的相关语法吧!

    [root@linux ~]# read [-pt] variable
    参数:
    -p  :后面可以接提示字符!
    -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    范例:
     
    范例一:让使用者由键盘输入一内容,将该内容变成 atest 变量
    [root@linux ~]# read atest
    This is a test
    [root@linux ~]# echo $atest
    This is a test
     
    范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串做成 named 变量
    [root@linux ~]# read -p "Please keyin your name: " -t 30 named
    Please keyin your name: VBird Tsai
    [root@linux ~]# echo $named
    VBird Tsai

    read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行,等待您输入。 如果加上 -t 后面接秒数之后,例如上面的范例当中,那么 30 秒之内没有任何动作时, 该指令就会自动略过了~如果是加上 -p ,嘿嘿!后面就会有比较多可以用的提示字符给我们参考! 在指令的下达里面,比较美观啦! ^_^


      declare / typeset

    declare typeset 是一样的功能,就是在宣告变量的属性。如果使用 declare 后面并没有接任何参数, 那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦! 那么 declare 还有什么语法呢?看看先:

    [root@linux ~]# declare [-aixr] variable
    参数:
    -a  :将后面的 variable 定义成为数组 (array)
    -i  :将后面接的 variable 定义成为整数数字 (integer)
    -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
    -r  :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset
    范例:
    范例一:让变量 sum 进行 100+300+50 的加总结果
    [root@linux ~]# sum=100+300+50
    [root@linux ~]# echo $sum
    100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
    [root@linux ~]# declare -i sum=100+300+50
    [root@linux ~]# echo $sum
    450         <==瞭乎??
     
    范例二:将 sum 变成环境变量
    [root@linux ~]# declare -x sum
     
    范例三:让 sum 变成只读属性,不可更动!
    [root@linux ~]# declare -r sum
    [root@linux ~]# sum=tesgting
    -bash: sum: readonly variable  <==老天爷~不能改这个变数了!

    declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell scrīpt 比较常用的啦!


      数组属性 array 说明

    某些时候,我们必须使用数组来宣告一些变量,这有什么好处啊?在一般人的使用上, 果然是看不出来有什么好处的!不过,如果您曾经写过程序的话,那才会比较了解数组的意义~ 数组对写数值程序的设计师来说,可是不能错过学习的重点之一哩!好!不啰唆~ 那么要如何设定数组的变量与内容呢?在 bash 里头,数组的设定方式是:

    var[index]=content

    意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 .... 等等,那个 index 就是一些数字啦,重点是用中刮号 ([ ]) 来设定的。 目前我们 bash 提供的是一维数组。老实说,如果您不必写一些复杂的程序, 那么这个数组的地方,可以先略过,等到有需要再来学习即可!因为要制作出数组, 通常与循环或者其它判断式交互使用才有比较高的意义存在!

    范例:设定上面提到的 var[1]  var[3] 的变数。
    [root@linux ~]# var[1]="small min"
    [root@linux ~]# var[2]="big min"
    [root@linux ~]# var[3]="nice min"
    [root@linux ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"

    比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组} 的方式来读取, 比较正确无误的啦!
    额外的变量设定功能

    刚刚我们提到了两种变量取用的方法,分别是这样:

    [root@linux ~]# echo $HOME
    [root@linux ~]# echo ${HOME}

    那么,在那个 ${variable} 的使用方法中,其实,我们还可以将变量进行一些修订的工作喔! 只要加上一些字符标志,后面再接着使用比对字符串,就能够修改变量的内容了! 我们取底下的例子来说明:在底下的例子中,假设我的变量名称为 vbird ,且内容为 /home/vbird/testing/testing.x.sh

    1. 完整呈现 vbird 这个变量的内容;
    [root@linux ~]# vbird="/home/vbird/testing/testing.x.sh"
    [root@linux ~]# echo ${vbird}
    /home/vbird/testing/testing.x.sh
     
    2.  vbird 变量中,从最前面开始比对,若开头为 / ,则删除两个 / 
       之间的所有数据,亦即 /*/
    [root@linux ~]# echo ${vbird##/*/}
    testing.x.sh    <==删除了 /home/vbird/testing/
    [root@linux ~]# echo ${vbird#/*/}
    vbird/testing/testing.x.sh   <==仅删除 /home/ 而已
    # 这两个小例子有趣了~变量名称后面如果接了两个 ## ,表示在 ##
    # 后面的字符串取『最长的』那一段;如果仅有一个 # ,表示取『最小的那一段』喔!
     
    3. 承上题,如果是从后面开始,删除 /* 呢?
    [root@linux ~]# echo ${vbird%%/*/}
    /home/vbird/testing/testing.x.sh  <==都没被删除
    [root@linux ~]# echo ${vbird%%/*}
        <==被删除光了!
    [root@linux ~]# echo ${vbird%/*}
    /home/vbird/testing   <==只删除 /testing.x.sh 部分
    # 这个例子当中需要特别注意,那个 % 比对的是『最后面那个字符』的意思,
    # 所以啰,第一个方式当然不对~因为 vbird 这个变量的内容最后面是 h 而不是 / 啊!
    # 至于 %%/* 则是删除『最长的那个 /* 』,当然就是全部喔!而 %/* 则是最短的那个!
     
    4.  vbird 变数中的 testing 取代为 TEST
    [root@linux ~]# echo ${vbird/testing/TEST}
    /home/vbird/TEST/testing.x.sh
    [root@linux ~]# echo ${vbird//testing/TEST}
    /home/vbird/TEST/TEST.x.sh
    # 如果变量后面接的是 / 时,那么表示后面是进行『取代』的工作~而且仅取代『第一个』
    # 但如果是 // ,则表示全部的字符串都取代啊!
    这里您稍微留意一下就好了~反正就是变量后面可以接 #, ##, %, %%, /, // 查看(268) 评论(0) 收藏 分享 管理

  • 续3:Linux shell初体验-变量(本文为转载,仅供学习参考)

    2008-06-05 22:48:59

    一般来说,不论是否为环境变量,只要跟我们目前这个 shell 的操作接口有关的变量, 通常都会被设定为大写字符,也就是说,『基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变量一般为系统内定需要的变量』。

    使用 set 除了会将系统的默认值秀出来之外,连带的所有的你自己设定的变量也会被秀出来! 同时需要注意的是,若当时有相当多人同时在在线的话,那么 你的变量只能给自己使用 ( 除非改的是系统的预设参数档,如 /etc/profile ),而不会干扰到别人的!就如同前面所说的, 由于你登入 Linux 之后会取得一个 PID ,而你的设定将只对这个 PID 与子程序有关!此外, 这次登入所进行的变量设定,如果没有更动到设定档, 那么这次设定的变量在下次登入时将被取消掉 ( 因为程序 PID 不见啰! ) !所以啰, 如果你想要你的变量每次都能在你登入的时候自动就设定好了,那么就必须将你的设定写入登入时加载的设定档!

    OKOK!那么上头那些变量当中,有哪些是比较重要的?大概有这几个吧!

    • PS1(提示字符的设定)

      这是 PS1 (数字的 1 不是英文字母!),这个东西就是我们的『命令提示字符』啊! 当我们每次按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数值了。上头 PS1 内显示的是一些特殊符号,每个版本 bash PSI 变量内的特殊符号可能有些许的差异, 你应该主动的以 man bash 去查询一下相关的变数。底下我列出 FC4 的环境下, 预设的 bash PS1 变量内的特殊符号代表意义:

     

      • \d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1"
      • \H :完整的主机名称。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名称就是 linux.dmtsai.tw
      • \h :仅取主机名称的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省略。
      • \t :显示时间,为 24 小时格式,如: HH:MM:SS
      • \T :显示时间,12 小时的时间格式!
      • \A :显示时间,24 小时格式, HH:MM
      • \u :目前使用者的账号名称;
      • \v BASH 的版本信息;
      • \w :完整的工作目录名称。家目录会以 ~ 取代;
      • \W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。
      • \# :下达的第几个指令。
      • \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

    • OK!所以,由预设的 PS1 内容为: '\[\u@\h \W\]\$ ' 就可以了解为何我们的提示字符会是: [root@linux ~]# 了吧!好了,那么假设我想要有类似底下的提示字符:


    [root@linux /home/dmtsai 16:50 #12]#


    ,那个 # 代表第 12 次下达的指令。 那么应该如何设定 PS1 呢?可以这样啊:

    [root@linux home]# PS1='[\u@\h \w \A #\#]\$ '
    [root@linux /home 17:02 #85]# 
    # 看到了吗?提示字符变了!变的很有趣吧!其中,那个 #85 比较有趣,
    # 如果您按下 [Enter] 后,该数字就会增加喔!为啥?上面有说明ㄇㄟ!

    • $(关于本 shell PID)

      其实这个咚咚代表的是『目前这个 Shell 的执行绪代号』,亦即是所谓的 PID (Process ID) 更多的程序观念,我们会在第四章的时候提及。想要知道我们的 shell PID ,就可以: echo $$ 即可!
    • ?(关于上个执行指令的回传码)

      虾密?问号也是一个特殊的变数?没错!在 bash 里面这个变量可重要的很! 这个变数是:『上个执行的指令所回传的值』, 上面这句话的重点是『上一个指令』与『回传值』两个地方。当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的数值来取代。 我们以底下的例子来看看:
    [root@linux ~]# echo $SHELL
    /bin/bash
    [root@linux ~]# echo $?
    0
    # 因为上个指令执行过程中,并没有错误,为成功的执行完毕,所以回传 0 
    [root@linux ~]# 12name=VBird
    -bash: 12name=VBird: command not found
    [root@linux ~]# echo $?
    127
    # 发生错误啦!所以 echo $? 时,就会出现错误的代码!
    # 我们可以利用这个代码来搜寻错误的原因喔!
    [root@linux ~]# echo $?
    0
    # 咦!怎么又变成正确了?这是因为 "?" 只与『上一个执行指令』有关,
    # 所以,我们上一个指令是执行『 echo $? 』,当然没有错误,所以是 0 没错!

     

    • OSTYPE, HOSTTYPE, MACHTYPE(主机硬件与核心的等级)

      这几个东西与程序的安装有关。我们在『Linux 主机规划 里面提到过关于主机的等级方面的问题,当我们在安装软件的时候, 需要透过编译器来将原始码编译成为二进制的档案 (binary file)。但是, 我们可以针对硬件的配备来进行编译的最佳化,此时,这些参数就可以被用到了! 基本上,目前主要的 distribution 都是针对 i386 亦即最低等级的机器进行最佳化, 这样才能够安装在较高阶的机器上,如果以 686 的机型来最佳化, 那么,可就无法向下兼容的喔!(早期的 OpenLinux 是针对 686 机器来释出软件, 所以,当时的 OpenLinux 是无法安装在 P-166 的机器上的。 )

    自订变量转成环境变量: export

    好了,上面我们环境变量也提过了,一些自订变量也提过了,那么,这两者有啥不同? 他的不同处,我们在 变量设定规则 当中稍微提过, 主要是由于变量可否被子程序所引用。
    当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次 bash ,那么你将进入『子程序』,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。 那么由于您已经进入了该子程序,所以在父程序中的自订变量设定将不再继续的存在。 会存在子程序中的,仅有『环境变量』

    如您想要让该变量内容继续的在子程序中使用,那么就请执行: export 参数 查看(276) 评论(0) 收藏 分享 管理

  • 续2:Linux shell初体验-变量(本文为转载,仅供学习参考)

    2008-06-05 22:45:53

    环境变量的功能

    环境变量可以帮我们达到很多功能~包括家目录的变换啊、提示字符的显示啊、执行文件搜寻的路径啊等等的, 还有很多很多啦!那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有多少变量啊?!呵呵!我们可以利用两个指令来查阅,分别是 env export 呢!


      一些环境变量的说明: env

    范例一:列出目前的 shell 环境下的所有环境变量与其内容。
    [root@linux ~]# env
    HOSTNAME=linux.dmtsai.tw   <== 这部主机的主机名称
    SHELL=/bin/bash            <== 目前这个环境下,使用的 Shell 是哪一个程序?
    TERM=xterm                 <== 这个终端机使用的环境是什么类型
    HISTSIZE=1000              <== 这个就是『记录指令的笔数』在 FC4 预设可记录 1000 
    USER=root                  <== 使用者的名称啊!
    LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:
    or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0
    0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=
    00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3
    1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00
    ;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示
    ENV=/root/.bashrc          <== 使用的个人环境设定档
    MAIL=/var/spool/mail/root  <== 这个使用者所取用的 mailbox 位置
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:
    /root/bin                  <== 不再多讲啊!是执行文件指令搜寻路径
    INPUTRC=/etc/inputrc       <== 与键盘按键功能有关。可以设定特殊按键!
    PWD=/root                  <== 目前使用者所在的工作目录 (利用 pwd 取出!)
    LANG=en_US.UTF-8           <== 这个与语系有关,底下会再介绍!
    HOME=/root                 <== 这个使用者的家目录啊!
    _=/bin/env                 <== 上一次使用的指令的最后一个参数(或指令本身)

    env environment (环境) 的简写啊~ 上面的例子当中,是列出来所有的环境变量。当然,如果使用 export 也会是一样的内容~ 只不过, export 还有其它额外的功能就是了,我们等一下再提这个 export 指令。 那么上面这些变量有些什么功用呢?底下我们就一个一个来分析分析!

    • HOME 代表使用者的家目录。还记得我们可以使用 cd ~ 去到使用者的家目录吗?或者利用 cd 就可以直接回到使用者家目录了。那就是取用这个功能啦~ 有很多程序都可能会取用到这个变量的值喔!
    • SHELL 告知我们,目前这个环境使用的 SHELL 是哪支程序? 如果是 bash 的话,预设是 /bin/bash 的啦!
    • HISTSIZE 这个与『历史命令』有关,亦即是, 我们曾经下达过的指令可以被系统记录下来,而记录的『笔数』则是由这个值来设定的。
    • ENV 这个使用者所使用的个人化环境设定档的读取档案。
    • MAIL 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)
    • PATH 就是执行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于档案的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。
    • LANG 这个重要!就是语系档案啰~很多数据都会用到他, 举例来说,当我们在启动某些 perl 的程序语言档案时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。 这部分我们会在下个小节做介绍的!
    • RANDOM 这个玩意儿就是『随机随机数』的变量啦!目前大多数的 distributions 都会有随机数产生器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:
    [root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number
    8   <== 此时会随机取出 0~9 之间的数值喔!

    大致上是有这些环境变量啦~里面有些比较重要的参数,在底下我们都会另外进行一些说明的~


      其它所有的变量说明: set

    而除了这些环境变量之外,还有没有什么重要的变量呢?当然有啊! 我们在 bash 的环境下,其实还有一些挺重要的变量,这些变量是『在这个 shell 环境下有效』的, 如果是在『子程序』,这些变量值就不会相同了。 那么如何观察目前 shell 环境下的所有变量呢?很简单啊,就用 set 即可!set 这个指令除了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来喔!信息多好多。 底下仅列出几个重要的内容。

    [root@linux ~]# set
    BASH=/bin/bash           <== bash 的主程序放置路径
    BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" 
    [5]="i386-redhat-linux-gnu")      <== bash 的版本啊!
    BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊!
    COLORS=/etc/DIR_COLORS.xterm      <== 使用的颜色纪录档案
    COLUMNS=115              <== 在目前的终端机环境下,使用的字段有几个字符长度
    HISTFILE=/root/.bash_history      <== 历史命令记录的放置档案,隐藏档
    HISTFILESIZE=1000        <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。
    HISTSIZE=1000            <== 目前环境下,可记录的历史命令最大笔数。
    HOSTTYPE=i386            <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件
    IFS=$' \t\n'             <== 预设的分隔符
    LINES=35                 <== 目前的终端机下的最大行数
    MACHTYPE=i386-redhat-linux-gnu    <== 安装的机器类型
    MAILCHECK=60             <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!
    OLDPWD=/home             <== 上个工作目录。我们可以用 cd - 来取用这个变量。
    OSTYPE=linux-gnu         <== 操作系统的类型!
    PPID=20046               <== 父程序的 PID (会在后续章节才介绍)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
                             <== 上面这个是命令提示字符!与底下也有关。
    PS1='[\u@\h \W]\$ '      <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的
                                 [root@linux ~]#  [dmtsai ~]$ 的设定值啦!可以更动的!
    RANDOM=13586             <== 随机数啊!上面已经提过啰~
    SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系
    name=VBird               <== 刚刚设定的自订变量也可以被列出来喔!
    $                        <== 目前这个 shell 所使用的 PID
    ?                        <== 刚刚执行完指令的回传值。

    一般来说,不论是否为环境变量,只要跟我们目前这个 shell 查看(251) 评论(0) 收藏 分享 管理

  • 续:Linux shell初体验-变量(本文为转载,仅供学习参考)

    2008-06-05 22:42:55

    较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字符、钱字号、quote 符号等等,底下的例题想一想吧!

    例题二:在变量的设定当中,单引号与双引号的用途有何不同?
    答:

    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢?


    [root@linux ~]# name=VBird
    [root@linux ~]# echo $name
    VBird
    [root@linux ~]# myname="$name its me"
    [root@linux ~]# echo $myname
    VBird its me
    [root@linux ~]# myname='$name its me'
    [root@linux ~]# echo $myname
    $name its me


    发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容, 仅为一般字符的显示型态而已!这里必需要特别小心在意!

     

    例题三:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
    答:

    在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行如同上面范例六的执行内容啰。

    另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:


    [root@linux ~]# ls -l `locate crontab`


    如此一来,先以 locate 将文件名数据都列出来,再以 ls 指令来处理的意思啦!瞭了吗? ^_^


  • Linux shell初体验-变量(本文为转载,仅供学习参考)

    2008-06-05 22:33:29

    为了搞懂一个小代码,无意间发现了这个不错的内容,现贴过来供大家一起参考。。
    1.
    变量的取用与设定:echo, 变量设定规则, unset
    2. 
    环境变量的功能
    3. 
    变量键盘读取、数组与宣告: read, array, declare

    -------------------------------------------------------------------------------------

    变量的取用与设定:echo, 变量设定规则, unset

    利用 echo 这个指令来取用变量, 但是,变量在被取用时,前面必须要加上 $ 才行,举例来说,要知道 PATH 的内容,该如何是好?

    [root@linux ~]# echo $variable
    [root@linux ~]# echo $PATH
    /bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
    [root@linux ~]# echo ${PATH}

    变量的取用就如同上面的范例,利用 ehco 就能够读出,只是需要在变量名称前面加上 $ 或者是以 ${variable} 的方式来取用都可以!

    例题一:请在屏幕上面显示出您的环境变量 HOME MAIL
    答:

    echo $HOME
    echo $MAIL


    OK!现在我们知道了变量与变量内的之间的相关性了,好了,那么我要如何『设定』或者是『修改』 某个变量的内容啊?!很简单啦!用『等号(=)』连接变量与他的内容就好啦!举例来说: 我要将 myname 这个变量名称的内容设定为 VBird ,那么:

    [root@linux ~]# echo $myname
       <==这里并没有任何数据~因为这个变量尚未被设定!是空的!
    [root@linux ~]# myname=VBird
    [root@linux ~]# echo $myname
    VBird  <==出现了!因为这个变量已经被设定了!

    而由上面的例子当中,我们也可以知道: 当一个变量名称尚未被设定时,预设的内容是『空』的 另外,变量在设定时,还是需要符合某些规定的,否则会设定失败! 这些规则如下所示啊!

    1.      变量与变量内容以等号『=』来连结;

    2.      等号两边不能直接接空格符;

    3.      变量名称只能是英文字母与数字,但是数字不能是开头字符;

    4.      若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意, 双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;

    5.      必要时需要以跳脱字符『 \ 』来将特殊符号 ( Enter, $, \, 空格符, ' ) 变成一般符号;

    6.      在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote ` command` 』;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)

    7.      若该变量为扩增变量内容时,则需以双引号及 $变量名称 如:『 "$PATH":/home』继续累加内容;

    8.      若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量, 如『export PATH』;

    9.      通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴趣与嗜好 )

    10.   取消变量的方法为:『unset 变量名称』。

    底下我们举几个例子来让您试看看,就知道怎么设定好您的变量啰!

    范例一:设定一变量 name ,且内容为 VBird 
    [root@linux ~]# 12name=VBird
    -bash: 12name=VBird: command not found  <==屏幕会显示错误!因为不能以数字开头!
    [root@linux ~]# name = VBird  <==还是错误!因为有空白!
    [root@linux ~]# name=VBird    <==OK 的啦!
     
    范例二:承上题,若变量内容为 VBird's name 呢?
    [root@linux ~]# name=VBird's name  
    # 因为单引号可以将 Enter 这个特殊字符取消,所以,您可以继续在下一行输入内容~
    # 不过,这与我们要达到的功能不同,所以,算是失败的啦!
    [root@linux ~]# name="VBird's name"  <==OK 的啦!
    [root@linux ~]# name=VBird\'s\ name
    # 利用反斜线 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦!
     
    范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
    [root@linux ~]# PATH=$PATH:/home/dmtsai/bin
    [root@linux ~]# PATH="$PATH":/home/dmtsai/bin
    # 上面这两种格式在 PATH 里头的设定都是 OK 的!但是底下的例子就不见得啰!
     
    范例四:呈范例三,我要将 name 的内容多出 "yes" 呢?
    [root@linux ~]# name=$nameyes  
    # 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!
    # 呵呵!我们可没有设定过 nameyes 这个变量吶!所以,应该是底下这样才对!
    [root@linux ~]# name="$name"yes
    [root@linux ~]# name=${name}yes
     
    范例五:如何让我刚刚设定的 name=VBird 可以用在下个 shell 的程序?
    [root@linux ~]# name=VBird
    [root@linux ~]# bash        <==进入到所谓的子程序
    [root@linux ~]# echo $name  <==嘿嘿!并没有刚刚设定的内容喔!
    [root@linux ~]# exit        <==离开刚刚的子程序
    [root@linux ~]# export name
    [root@linux ~]# bash        <==进入到所谓的子程序
    [root@linux ~]# echo $name  <==出现了设定值了!
    [root@linux ~]# exit        <==离开刚刚的子程序
    # 什么是『子程序』呢?就是说,在我目前这个 shell 的情况下,
    # 去启用另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下,
    # 父程序的自订变量是无法在子程序内使用的。但是透过 export 将变量变成
    # 环境变量后,就能够在子程序底下应用了!很不赖吧!至于程序的相关概念
     
    范例六:如何进入到您目前核心的模块目录?
    [root@linux ~]# cd /lib/modules/`uname -r`/kernel
    # 每个操作系统核心版本都不相同,以 FC4 为例,他的预设核心版本是 
    # 2.6.11-1.1369_FC4 所以,他的模块目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 
    # 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令
    # 先取得版本信息,所以啰,就可以透过上面指令当中的内含指令 `uname -r` 
    # 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程序所放置
    # 的目录啰!很方便吧!
     
    范例七:取消刚刚设定的 name 这个变量内容
    [root@linux ~]# unset name

     

211/212>

数据统计

  • 访问量: 8446
  • 日志数: 22
  • 图片数: 3
  • 文件数: 2
  • 建立时间: 2008-05-25
  • 更新时间: 2008-06-26

RSS订阅

Open Toolbar