linux的shell进化简史
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进化简史相关推荐
- linux shell cgi post,linux下shell处理cgi的方法--post get
web server获取网页上HTML的DOM对象信息发送来的信息,主要有get和post方法. 介绍原理的文章很多,但介绍实际应用到linux的shell中的文章很少. 1.get方法 ①表单源码如 ...
- linux shell脚本攻略_(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤...
今天为大家带来的内容是:(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤 本文内容主要介绍了Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤,文章 ...
- linux shell脚本if,linux的shell脚本中if,for,while的解析与应用
linux的shell中有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),它们对我们平时的脚本编写和命令输入都有很大的作用,掌握了这些一定会对我们有很大的帮助. 一. ...
- Linux环境Shell脚本上传下载阿里云OSS文件
为什么80%的码农都做不了架构师?>>> Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...
- 互联网大脑进化简史,华为云EI智能体加入-2018年7月新版
要:华为云EI智能体是2018年以来产生的第八个类脑智能巨系统,在中国,目前除了小米.联想.今日头条,几乎所有的互联网巨头都提出了自己的"大脑"系统建设计划. 1969年互联网诞生 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $ ...
- 详解Linux交互式shell脚本中创建对话框实例教程
详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...
- linux在shell中获取时间
linux在shell中获取时间 获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用 ...
- linux中shell如何实现毫秒级别的sleep
方法2.usleep 10000 (usleep为十的负六次方秒,详细见man usleep) 本文转自博客园知识天地的博客,原文链接:linux中shell如何实现毫秒级别的sleep,如需转载请自 ...
最新文章
- 人工智能及其应用(第5版).蔡自兴-3章课后习题。【参考答案】
- c# 调用SQL Server存储过程返回值(转)
- 十六、字符驱动及应用
- [USACO1.3]滑雪课程设计Ski Course Design
- SAP CRM service contract和individual object
- 解决后端返回数据中的大数字问题(使用第三方包json-bigint )
- ARM和X86功耗差别的深层原因探讨
- mysql字符串处理函数left()、length()使用
- SQL Server高级查询之子查询(单行子查询)
- 带有记忆的菲波那切数列
- 终于搞清楚了:SOLID设计原则出处
- CSDN积极响应网信办“知识社区问答”行为规范管理,共筑健康网络空间
- HTML+CSS注册页面案例【Java源代码】
- shor 量子算法,合数分解
- 想知道数字1-13的深层含义吗?
- 垃圾填埋场渗滤液厌氧处理过程中沼气的综合利用
- html网页转换swf格式,[转]html网页 swf播放器使用代码
- [OpenGL]OpenGL几何变换的秘密--投影(透视投影、平行投影、正投影)
- 用java的二维数组做一个简易计算优惠小程序(附带源码)
- PC站跳转M站的方法
热门文章
- 超分辨率 测试集处理(基于插值下采样)
- 《惢客创业日记》2018.11.07(周三)线上创业大赛该怎么办?
- 【BCT认证】Bonjour Conformance Test教程
- 鸿蒙OS2.0 设备开发之Hi3861-基础功能汇总
- 大学计算机知识点cad,大一cad考试试题「附答案」
- 鸿蒙os3.0操作界面最新,鸿蒙os2.0未来版本将启用全新UI界面
- 开源医疗软件国外实践及其在中国推进探讨
- 【格式化文档】ISO27001控制措施+ISO27002实施指南 【中】
- 我的网络通信相关文章
- 主要针对项目路径发生变化产生 报错:Project SDK is not defined