Bourne-Again Shell

Bourne-Again Shell,即bash,是一个开源的GNU项目,旨在替换Bourne Shell。Bourne-Again Shell由Brian Fox开发,现在已经成为最流行的Shell之一,被广泛应用在Linux、Darwin、Windows和Cygwin之上。

除了支持脚本的向后兼容性,bash还吸收了Korn Shell和C Shell的一些特性。例如,命令历史记录,命令行编辑,目录堆栈,很多实用的环境变量,命令行自动完成,等等。

Bash继续发展了一些新的特性,如支持正则表达式和关联数组。

虽然一些特性是bash独有的,但我们仍然可以编写与其他脚本语言相兼容的脚本。下面是在bash中统计可执行文件数目的脚本示例。

代码3:在Bourne-Again Shell中统计可执行文件的数目

这些Shell之间的一个关键区别是它们使用了不同的授权。Bash是一个GNU项目,遵循GPL授权,而C Shell则遵循了BSD许可,Korn Shell则遵循了通用公共许可证。

早期Shell的许多理念和接口在35年之后依然保持不变,这对其作者是一个巨大的肯定。任何一个行业都在不断重塑自我,Shell也在发生着历史的变迁。尽管许多新的Shell被开发出来,但Bourne Shell及其后继者依然是现在的首选。

#!/bin/sh

#set -x

echo -n "Can you write device drivers?"

....

其中如果去掉set -X前面的注释的话会跟踪整个脚本的运行,echo函数对于调试是很有帮助的,但是有时候代码多了之后,想去掉也是很难的。

根据debug的等级来决定输出

#!/bin/sh

debug=1

test $debug -gt 0 &&echo "Debug is on"

echo -n "Can you write device drivers?"

read answer

...

debug=2

test $debug -gt 0 &&echo "A little data"

test $debug -gt 1 &&echo "Some more data"

test $debug -gt 2 &&echo "Even some more data"

用一个函数来检查错误

alert(){

if[ "$1" -ne 0 ]

then

echo "WARNING: $2 did not complete successfully.">&2

exit $1

else

echo "INFO:$2 completed successfully">&2

fi

}

如下所示的调用:

cat  $LOG|mail -s "$FROM attempting to get $FILE" $TO

alert $? "Mail of $LOG to $TO"


输出如下:

INFO:Mail of $LOG to $TO completed successfully.

INFO:Mail of $LOG to $TO did not complete successfully.

还有就是根据我们的输入去逐条的人工去执行,查看结果

第二章:标准函数库(需要进行实践,还不确定怎么用)
一:被反复使用的函数和例程写到库函数文件中。

#!/bin/echo Waring: this library should be sourced!
    ostype()
    {
        osname=`uname -s`
        OSTYPE=UNKNOW
        case $osname in
            "Linux") OSTYPE="LINUX"
            ;;
        esac
        return 0
    }
    ostype
    echo "system is $OSTYPE"

第一行必须以source命令执行该库文件,将变量OSTYPE的值载入到环境中
    避免直接执行库文件
    例如:source ./test.sh   
    优秀的shell库实例:Gentoo Linux
               /etc/inti.d/funcitons.sh

二:几个函数:
    例子1.
    传入任一数字,判断数字奇偶性
    evenodd()
    {
        LAST_DIGIT=`echo $1 |sed 's//(.*/)/(./)$//2/'`
        case $LAST_DIGIT in
        0|2|4|6|8)
        echo "o"
        return 1
        ;;
        *)
        echo "j"
        return 0
        ;;
        esac
    }
    evenodd 123
    例子2.
    判断远程系统是否运行,是否接入网络。
    isalive()
    {
        NODE=$1
        ping -c 3 $NODE >/dev/null 2>&1
        if [ $? -eq 0 ]
        then
            echo "a"
            return 1
        else
            echo "ua"
            return 0
        fi
    }
    isalive 10.192.39.11
三:库函数的调用
    1.在shell文件中添加
    source std_lib
    载入库函数   
    2.点句法(source 换成 .)
    . std_lib

第三章: 操纵时间和日期

//errHunter的示例程序,包括所有能检测出的错误#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<dirent.h>#include<string>void function(){chara;
//errHunter的示例程序,包括所有能检测出的错误#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<dirent.h>#include<string>void function(){char a;/******语义的检查******///变量为初始化使用,case语句缺少break,重复break    switch(a)     {case 'a':break;case 'b':break;break;case 'c':case 'd':return;default:

    }    

/******对内存的检查******///c和c++动态申请内存中创建和释放语句的匹配   int *p=(int*)malloc(sizeof(int)*10);   free(p);

int *p=new int(10);   delete p;/******未用的函数或变量,未初始化的变量******///对文件进行操作,在用fclose之前是否判断指针为空(指针)   FILE* fp;   fp=fopen("example.txt","r+");   fclose(fp);//未使用的变量   int i;//未使用的函数   int g(){return 0;   }

/******STL的错误使用******/

/******对废弃函数的使用会给出警告******///bcmp   bcopy   bzero   ftime   getwd   .......

/******对不可冲入函数的调用会给出警告******///asctime   crypt   ctermid   ctime   ecvt   fcvt   fgetgrent   gcvt   getlogin   getgrnam   ......

/******其他的一些检查******///把一个bool值赋给指针   bool m=false;   p=m;//对bool进行增加操作   m++;//sprintf的错误使用   char *str="Hello World!";   sprintf(str,"<%s>",str);//除以0   int  num=10;   num=num/0;//对输入流使用fflush//fflush(in);

//在assert语句中赋值   assert(num=5);//substr和strncmp中不正确的参数   std::string str2;   std::string str="We are the best!";   str2=str.substr(16);//对output不正确的使用   std::cout<<std::cout;//在sizeof()中做计算   i=sizeof(num*2)

//不可到达的代码,冗余代码   if(true)   {   }else   {//这里不可到达        printf("Hello World!");   }}

//

int main(){    f();return 0;}


/******语义的检查******///变量为初始化使用,case语句缺少break,重复break    switch(a)     {case 'a':break;case 'b':break;break;case 'c':case 'd':return;default:

    }    

/******对内存的检查******///c和c++动态申请内存中创建和释放语句的匹配   int *p=(int*)malloc(sizeof(int)*10);   free(p);

int *p=new int(10);   delete p;/******未用的函数或变量,未初始化的变量******///对文件进行操作,在用fclose之前是否判断指针为空(指针)   FILE* fp;   fp=fopen("example.txt","r+");   fclose(fp);//未使用的变量   int i;//未使用的函数   int g(){return 0;   }

/******STL的错误使用******/

/******对废弃函数的使用会给出警告******///bcmp   bcopy   bzero   ftime   getwd   .......

/******对不可冲入函数的调用会给出警告******///asctime   crypt   ctermid   ctime   ecvt   fcvt   fgetgrent   gcvt   getlogin   getgrnam   ......

/******其他的一些检查******///把一个bool值赋给指针   bool m=false;   p=m;//对bool进行增加操作   m++;//sprintf的错误使用   char *str="Hello World!";   sprintf(str,"<%s>",str);//除以0   int  num=10;   num=num/0;//对输入流使用fflush//fflush(in);

//在assert语句中赋值   assert(num=5);//substr和strncmp中不正确的参数   std::string str2;   std::string str="We are the best!";   str2=str.substr(16);//对output不正确的使用   std::cout<<std::cout;//在sizeof()中做计算   i=sizeof(num*2)

//不可到达的代码,冗余代码   if(true)   {   }else   {//这里不可到达        printf("Hello World!");   }}

//

int main(){    f();return 0;}

//errHunter的示例程序,包括所有能检测出的错误#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<dirent.h>#include<string>void function(){char a;/******语义的检查******///变量为初始化使用,case语句缺少break,重复break    switch(a)     {case 'a':break;case 'b':break;break;case 'c':case 'd':return;default:

    }    

/******对内存的检查******///c和c++动态申请内存中创建和释放语句的匹配   int *p=(int*)malloc(sizeof(int)*10);   free(p);

int *p=new int(10);   delete p;/******未用的函数或变量,未初始化的变量******///对文件进行操作,在用fclose之前是否判断指针为空(指针)   FILE* fp;   fp=fopen("example.txt","r+");   fclose(fp);//未使用的变量   int i;//未使用的函数   int g(){return 0;   }

/******STL的错误使用******/

/******对废弃函数的使用会给出警告******///bcmp   bcopy   bzero   ftime   getwd   .......

/******对不可冲入函数的调用会给出警告******///asctime   crypt   ctermid   ctime   ecvt   fcvt   fgetgrent   gcvt   getlogin   getgrnam   ......

/******其他的一些检查******///把一个bool值赋给指针   bool m=false;   p=m;//对bool进行增加操作   m++;//sprintf的错误使用   char *str="Hello World!";   sprintf(str,"<%s>",str);//除以0   int  num=10;   num=num/0;//对输入流使用fflush//fflush(in);

//在assert语句中赋值   assert(num=5);//substr和strncmp中不正确的参数   std::string str2;   std::string str="We are the best!";   str2=str.substr(16);//对output不正确的使用   std::cout<<std::cout;//在sizeof()中做计算   i=sizeof(num*2)

//不可到达的代码,冗余代码   if(true)   {   }else   {//这里不可到达        printf("Hello World!");   }}

//

int main(){    f();return 0;}

转载于:https://www.cnblogs.com/zhanglanyun/archive/2012/01/06/2313966.html

linux的shell进化简史相关推荐

  1. linux shell cgi post,linux下shell处理cgi的方法--post get

    web server获取网页上HTML的DOM对象信息发送来的信息,主要有get和post方法. 介绍原理的文章很多,但介绍实际应用到linux的shell中的文章很少. 1.get方法 ①表单源码如 ...

  2. linux shell脚本攻略_(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤...

    今天为大家带来的内容是:(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤 本文内容主要介绍了Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤,文章 ...

  3. linux shell脚本if,linux的shell脚本中if,for,while的解析与应用

    linux的shell中有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),它们对我们平时的脚本编写和命令输入都有很大的作用,掌握了这些一定会对我们有很大的帮助. 一. ...

  4. Linux环境Shell脚本上传下载阿里云OSS文件

    为什么80%的码农都做不了架构师?>>>    Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...

  5. 互联网大脑进化简史,华为云EI智能体加入-2018年7月新版

    要:华为云EI智能体是2018年以来产生的第八个类脑智能巨系统,在中国,目前除了小米.联想.今日头条,几乎所有的互联网巨头都提出了自己的"大脑"系统建设计划. 1969年互联网诞生 ...

  6. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID)  $!  Shell最后运行的后台Process的PID  $ ...

  7. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  8. linux在shell中获取时间

    linux在shell中获取时间 获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用 ...

  9. linux中shell如何实现毫秒级别的sleep

    方法2.usleep 10000 (usleep为十的负六次方秒,详细见man usleep) 本文转自博客园知识天地的博客,原文链接:linux中shell如何实现毫秒级别的sleep,如需转载请自 ...

最新文章

  1. 人工智能及其应用(第5版).蔡自兴-3章课后习题。【参考答案】
  2. c# 调用SQL Server存储过程返回值(转)
  3. 十六、字符驱动及应用
  4. [USACO1.3]滑雪课程设计Ski Course Design
  5. SAP CRM service contract和individual object
  6. 解决后端返回数据中的大数字问题(使用第三方包json-bigint )
  7. ARM和X86功耗差别的深层原因探讨
  8. mysql字符串处理函数left()、length()使用
  9. SQL Server高级查询之子查询(单行子查询)
  10. 带有记忆的菲波那切数列
  11. 终于搞清楚了:SOLID设计原则出处
  12. CSDN积极响应网信办“知识社区问答”行为规范管理,共筑健康网络空间
  13. HTML+CSS注册页面案例【Java源代码】
  14. shor 量子算法,合数分解
  15. 想知道数字1-13的深层含义吗?
  16. 垃圾填埋场渗滤液厌氧处理过程中沼气的综合利用
  17. html网页转换swf格式,[转]html网页 swf播放器使用代码
  18. [OpenGL]OpenGL几何变换的秘密--投影(透视投影、平行投影、正投影)
  19. 用java的二维数组做一个简易计算优惠小程序(附带源码)
  20. PC站跳转M站的方法

热门文章

  1. 超分辨率 测试集处理(基于插值下采样)
  2. 《惢客创业日记》2018.11.07(周三)线上创业大赛该怎么办?
  3. 【BCT认证】Bonjour Conformance Test教程
  4. 鸿蒙OS2.0 设备开发之Hi3861-基础功能汇总
  5. 大学计算机知识点cad,大一cad考试试题「附答案」
  6. 鸿蒙os3.0操作界面最新,鸿蒙os2.0未来版本将启用全新UI界面
  7. 开源医疗软件国外实践及其在中国推进探讨
  8. 【格式化文档】ISO27001控制措施+ISO27002实施指南 【中】
  9. 我的网络通信相关文章
  10. 主要针对项目路径发生变化产生 报错:Project SDK is not defined