lua小脚本还是很像bash shell的,还是看看说明好好学习一下吧

Windows Sockets
&摘& 要& 该文在介绍Windows Sockets背景知识的基础上,结合在Windows环境中建立So ckets的过程,重点介绍了Windows Sockets的特点,及其基本的结构体和函数;继而结合开发Windows Sockets应用程序的经验,介绍了Windows Sockets对系统硬软件环境的要求、调试方法及其在Internet互联联网上的应用。&&& 关键词& Sockets& Internet& TCP/IPSocket指一个通信端点,用户的应用程序可以籍助它通过网络与其他Socdets应用程序相互通信。Windows 系统中的Socket则是该环境中的一个通信端点。&&& 近年来,鉴于PC机上Windows系统的流行,以及Internet互联网在全球范围内的广泛使用,很多用户需要在Windows环境中开发可通过互联网进行通信的应用软件。笔者所在课题组在用Wavelet小波方法对图像进行实时压缩与传输应用程序的开发中曾采用Windows Socdets进行数据文件与实时图像经由Internet互联网的传输。本文将根据笔者的实践对有关内容进行介绍。&&& 一、背景知识&&& 众所周知,ISO颁布的OSI开放式网络系统互连标准由7层组成,其中第1~4层用于保证不同格式数据的传输,而第5~7层则用于保证通信双方相互间的正确理解。附图给出了Window sSockets的网络层次,通过与OSI标准对照,可以看出Windows Sockets是处在第4层与第5层的位置上。&&& Internet互联网采用TCP/IP(Transmission Control Protocol/Internet Protocol)协议。从附图可以看出:Windows Sockets正好在该协议的上面一层。&&& 由Microsoft公司开发的Windows Socdets API建立了Windows环境与网络之间的编程界面,它以伯克利大学的BSD Sockets的编程模块为基础,同时含有BSD式的函数(共30个左右,其函数名只采用小写英文字母)和专门为Windows视窗系统扩展的函数(近20个,其函数名采用大、小写英文字母混用)。&&& Windows Sockets API有适于Windows 3.x和适于Windows NT的两种版本。两者均含有上述两类函数,并均通过Windows系统中的Message消息予以驱动。两者不同之处在于:前者是1 6位,单进程;而后者是32位,可在多线程视窗(Multithreaded Windows)中使用。&&& 根据所传输数据类型的不同,Windows Sockets又可分为Stream Sockets和Datagram So ckets两种类型。前者对应不按记录定界的数据字节流,使用TCP对应的Internet互联网地址,双方互相连接,因而它可保证按正确的顺序,单一和可靠地传输数据;后者对应记录型数据流,使用UDP对应的Internet互联网地址,双方不需直连,按固定的最大长度进行传输,它不能保证按顺序传输数据,并可能出现数据的重复,或者丢失。附图 Windows Sockets与OSI标准网络层次结构&&& 二、建立与运作过程&&& 在实际应用中我们至少要涉及两个应用程序的Socket(一般各自位于连在Internet互联网上的两台微机上,分别起Server服务器和Client客户机的作用,本文分别简称为&服务器So cket/和&客户机Socket&)相互交换信息与传输数据,因此需要在服务器与客户机的应用程序中分别建立Socket,然后建立相互之间的连接和通信。实际上是同一程序在服务器和客户机双方分别执行。&&& 1.Windows Socdet的初始化&&& 在Windows环境中建立Socket的第一步是初始化应用程序中的Socket,即按给定的Socke t版本,用WSAData结构体变量中各成员的值来初始化Socket.&&& WSAData结构体含有包括Socket版本号、系统状态等信息在内的7个成员,Windows Sock ets的初始化信息就存储在其对应的变量中。一般可通过调用WSAStartup()函数(含Socket版本号和该结构体变量地址两个参数)来完成对Socket的初始化。&&& 如上所述,我们必须对服务器Socket和客户机Socket分别进行初始化。用户在实际编程中常采用的对Socket的初始化方法有两种:对于就用单一固定在Socket上的程序可采用在打开应用程序窗口后即自动驱动message消息的方法;对于具有多个应用模块的应用程序最好采用菜单命令驱动message消息的方法。笔者采用后者。&&& 2.Socket的生成&&& 在应用程序完成对Socdet的初始化后,即可调用Socket()函数(含有网络地址类型、传输数据类型和网络协议3个参数)生成Socket,该函数返回所生成Socket的句柄。&&& 在该函数的3个参数中:&&& (1)网络地址类型可以取AF-INET(Address Family InterNET的缩写)和AF-UNSPEC(Addr ess Family-UNSPECified的缩写)。&&& (2)传输数据类型如前所述分别为SOCK-STREAM和SOCK-DGRAM(DataGRAM的缩写),为保证数据可靠的传送,笔者采用的前一种;&&& (3)缺省的协议就是TCP/IP;对应参量值取0;如果网络地址类型取AF-UNSPEC,则此处必须指明相应的协议。&&& 3.将服务器地址赋予服务器Socket,然后使之进入Listen等待连接的监听状态……&&& 在应用程序完成对服务器Socket的初始化和生成Socket后,一般需要用服务器的地址先对SOCKADDR-IN结构体变量赋值,然后调用bind()函数将服务器地址赋予服务器Socket(将SO CKADDR-IN结构体变量值转给SOCKADDR结构体变量),再调用Listen()函数让服务器Socket进入Listen&等待连接&的监听状态……。&&& (1)对服务器Socket的SOCKADDR-IN结构体变量赋值&&& SOCKADDR-IN(SOCKet ADDRess-InterNet的缩写)只适用于Internet地址类型,是一种特殊的Socket地址结构体,它含有Internet Socket地址类型、IP端口号、IP地址、填补字节( 以保证与SOCKADDR结构体总长度相同)4个成员,它用于还没有被赋予相应主机地址的Socket ;由于它与下面要介绍的SOCKADDR结构体具有相同的总长度,因此SOCKADDR-IN结构体变量的值可通过bind()、connect()或accept()函数直接转给对应Socket的SOCKADDR结构体变量。&&& SOCKADDR-IN结构体变量的第一个参量对于Internet互联网可取定为AF-INET;第二个参量可由SocKet的最终用户通过对话框输入,例如12;第三个参量对于Server服务器一方可取一待定值INADDR-ANY;第四个参量无需赋值。&&& (2)将服务器地址赋予服务器Socket。&&& 调到bind()函数(含服务器Socket句柄、服务器的SOCKADDR结构体变量及其长度第三个参量)将服务器对应的SOCKADDR-IN结构体变量值直接转给服务器的SOCKADDR结构体变量,从而将服务器地址赋予其Socket.&&& SOCKADDR结构体是Socket的一般地址结构,它用于存储参与Windows Sockets通信的计算机的IP地址,它含有Socket采用的地址类型和具体地址两个成员。如上所述,它与SOCKADDR- IN结构体具有相同的总长度,SOCKADDR-IN结构体变量的地址值可由bind()、connect()或ac cept()函数直接转给对应Socket和SOCKADDR结构体变量,从而实现将地址赋予Socket.&&& (3)服务器Socket进入Listen&等待连接&的监听状态&&& 调用Lister()函数(含服务器Socket句柄和最大监听态值两个参量),让服务器Socket进入&等待连接&的监听状态:等待来自客户机Socket的connect&要求连接&信号。&&& (4)服务器Socket在收到客户机Socket发来的connect&要求连接&信号后,发回accept&接受连接&信号。&&& 处于监听状态的服务器Socket一旦收到客户机Socket发来的connect&要求连接&信号后,立即调用accept()函数(含处于监听态的服务器Socket句柄、发出conncet&要求连接&信号的客户机的SOCKADDR结构体变量地址及其长度等3个参量)将客户机对应的SOCKADDR-IN结构体变量值转给服务器的SOCKADDR结构体变量,该函数返回一个新的Socket句柄,从而在服务器应用程序中产生一个新的被赋予已连客户机地址的Socket,同时发回accept&接受连接&的信号。&&& (5)连接实现&&& 一旦客户机Socket收到服务器Socket发来的accept&接受连接&信号后,连接实现。&&& 4.将服务器地址赋予客户机Socket,然后使之发出connect&要求连接&信号,在接到服务器Socket的accept&接受连接&的信号后,连接实现。在应用程序完成对客户机Socket的初始化和生成客户机Socket后,一般则需要用欲连服务器的地址先对SOCKADDR-IN结构体变量赋值,然后调用connect()函数将服务器地址赋于客户机Socket(将SOCKADDR-IN结构体变量转给S OCKADDR结构体变量),之后由客户机Socket向服务器Socket发出connect&要求连接&信号,在客户机Socket接到由服务器Socket发回的accept&接受连接&的信号后,即双方实现连接。&&& (1)对客户机Socket的SOCKADDR-IN结构体变量赋值&&& SOCKADDR-IN结构体变量的第一个参量对于Internet互联网仍可取定为AF-INET;第二个参量仍由Socket的最终用户通过对话框输入(应同于服务器Socket,例如12);第三个参量则先由Socket的最终用户通过对话框输欲连服务器的名字或地址(显然名字较为方便)然后利用g ethostbyname()或gethostbyaddr()函然将名字或地址转换为指向hostent结构体变量的指针(hostent结构体含有主机名、替换名、地址类型、地址长度、地址5个成员),再将hostent结构体变量的地址成员值复制到SOCKADDR-IN结构体变量上;第四个参量仍无需赋值。&&& (2)将服务器地址赋予客户机Socket,然后使之发出connect&要求连接&信号&&& 调用connect()函数(含申请连接的客户机Socket句柄、欲连服务器的SOCKADDR结构体变量地址及其长度等3个参量)将服务器对应的SOCKADDR-IN结构体变量值转给客户机的SOCKAD DR结构体变量,从而将服务器地址赋予客户机S之后由客户机Socket向服务器Socket发出connect&要求连接&信号。&&& (3)实现连接&&& 一旦客户机Socket收到来自服务器Socket发回的accept&接受连接&的信号,则表示服务器与客户机双方的Sockets已经通过Internet互联网实现连接。&&& 5.已连通双方Sockets之间的数据通信&&& 当服务器与客户机双方的Sockets通过Internet网实现连接后,任一方均可通过互联网向对方发送,也可以接收对方发来的数据。&&& (1)数据的发送&&& 相互连接的Sockets任一方均可调用send()函数(含发送目标方的Socket句柄、要传输数据所在缓冲区地址、数据长度、调用标志等4个参量)向对方发送各种类型的数据,发送成功后返回所发送的字符数。&&& (2)数据的接收&&& 相互连接的Sockets双方均应可调用WSASSyncSelect()函数等待来自网络的FD-READ事件通知,然后驱动message消息接收对方Socket发来的数据。&&& (1)调用WSASSyncSelect()函数(含应收到事件通知的Socket句柄、应收到message自己的窗口句柄、应收到的message消息名、事件通知类型等4个参量)等待来自网络的FD-READ事件通知,驱动相应的mesaage消息。&&& (2)在被驱动的message消息中调用recv()函数(含接收方的Socket句柄、放置所接收数据的缓冲区地址、数据长度、调用标志等4个参量)接收对方Socket传来的数据。&&& 6.Socket的关闭&&& 相互连接的Sockets任一方均可调用WSASSyncSelect()函数(将后两个参量置0)来中止S ocket等待网络事件通知,再调用无参WSACIeanup()函数关闭Socket.而相互连接的Sockets任一方关闭的Socket时,均会向对方发出FD-CLOSE事件通知,并驱动message消息通知用户。&&& 三、编程特点&&& 1.message消息驱动&&& Windows视窗系统采用meassge消息驱动的工作方式,Windows Sockets除了采用命令菜单驱动message消息外,还需采用专门用于接收网络事件通知与驱动message消息的函数WSASSy ncSelect()。&&& 上述Windows Sockets的建立、互连与数据发送过程均可按模块进行组合,然后分别放在相应的命令菜单驱动的message消息中,而互连后接收数据的过程则应放在由WSASSyncSelec t()函数驱动的message消息中。一般在WM-COMMAND所属的菜单驱动的message中至少应含有IDM-LTSTEN(等待连接)、IDM-CONNECT(要求连接)、IDM-SEND(发送数据)、IDM-CLOSE(关闭Socket)这几个基本消息;而WSASSyncSelect()函数驱动的message中至少应含有WM-READ(接收数据)消息。这些消息的名字可由用户自己确定。&&& 上述互连过程采用的是Blocking模式,即服务器在调用Listen()函数后陷入&死等&来自客户机Socket的connect&请求连接&信号的Bloking状态(此时用户不能激活相应应用程序窗口的命令菜单)。&&& 鉴于WSASSyncSelect()函数可以接收除FD-READ和FD-CLOSE以外的其它事件通知,如:FD -ACCEPT(&要求连接&的事件通知)、FD-CONNECT(&接受连接&的事件通知)等,因此我们也可以在服务器Socket和客户机Socket的互连过程中,在服务器一方进入监听状态后,调用该函数来等待FD-ACCEPT&要求连接&的事件通知,并驱动WM-ACCEPT&接受连接,准备通信……&的消息; 同样,我们也可以客户机一方在发出connect&要求连接&信号后,调用此函数来等待FD-CONNE CT&接受连接&的事件通知,并驱动WM-CONNECTED&连接成功,准备通信……&的消息。&&& 在服务器与客户机的Sockets互连过程中调用WSASSyncSelect()函数还可以避免服务器在调用Listen()函数后的Bloking状态转为Non-Blocking状态,而让用户可以在相应窗口中进行其它操作;但它将增加程序中的message消息数量,不利于独立的模块化DLL动态连接库的建立。&&& 2.DLL动态连接库文件的建立与应用&&& 考虑到Socket经常是作为Windows视窗应用程序中的一个功能模块,因此应尽可能将上述Socket的建立与运作过程函数化,并作为主程序文件的DDL动态连接库予以使用。&&& 在DLL动态连接库文件的生成过程中,首先应正确处理主程序与DLL、DLL内部各函数之间的参数传递;其次是应将命令菜单、人机对话框等资源放在主程序中;由函数WSASSyncSelec t()驱动的message消息不能放到DLL中,而应放到主程序中(但可将该消息的具体内容函数化,放到DLL中)。&&& 3.多线程视窗(Multithreaded Windows Processes)&&& 在Windows& NT视窗系统中可以实现多线程,例如,我们可以在服务器一方进入监听状态后,通过调用beginthread()函数来生成新的线程,在此线程中调用指定的自定义函数,而在该函数中调用accept()和recv()函数分别实现接收来自客户机Socket的connect&要求连接&信号,发回accept&接受连接&信号,和接收客户机发来的数据。&&& 四、对环境的要求与调试&&& 1.对运行环境的要求&&& Windows Sockets对运行环境的要求不是很高,一般宜采用Pentium微机、Windows NT视窗系统,此外系统还应装有下列软硬件。&&& (1)Windows Socket&&& Windows NT视窗系统已含有Windows Sockets软件系统,无须再进行安装;对于Windows 3.X版则需要单独进行安装。&&& (2)网卡&&& 由于TCP/IP可以工作在任何网络上,而Windows Sockets是在TCP/IP的上层,因此它也可以用在各种不同的网络上,即它对具体采用哪一种网卡没有特殊的要求,当然在可能的条件下应在同一网络中采用传输速率较高的网卡。&&& 笔者采用了使用PCI局域总线的CWL9510 PCI Ethernet网卡,其速率为20/10Mbps.在安装网卡前应从网络管理员处取得分配给该微机的名字、IP地址、Subnet mask、Gateway、Dom ain Suffix等参数。在主板上插入网卡后即可启动视窗,依次揿击Main、Control Panel、N etwork图标打开Network安装窗口,再揿击Add Adapter按钮添入所用的网卡,再调用随卡带来的安装程序进行安装。安装过程中按屏幕提示在对话框中正确填入上述参数即可。&&& (3)HOSTS文件&&& 为了帮助用户记住在Windows Sockets正常工作时所需要的主机名与IP地址,用户可以在硬盘C的指定目录中装入供TCP/TP使用的文件名为HOSTS的文本文件。笔者采用了Windows N T(V3.51)系统,该文件放于C:/WINNT35/SYSTEM32/DRIVERS/ETC子目录中。文件的每一行由用空格分开的3列栏目组成,依次给出Windows Sockets可能涉及的主机IP地址、主机名和由符号#引导的注释。&&& 一个典型的例子如下:&&& 127.0.0.1&&& Localhost#Local host&&& 128.146.155.114 robin.eng.ohio-state.edu#Server host&&& 128.146.155.112 gull.eng.ohio-state.edu#Client host &&& 2.调试&&& 笔者在MS Visual C++V4.0的 MS Developer Studio环境中对Windows Sockets DLL及应用主程序进行编辑和Build装配(含编译和联接)。&&& 在应用程序Sockets的调试与实际应用过程中,均可根据需要在程序中添加必要的人机交互对话框或信息框,以直观得到Sockets运行过程中各阶段的结果。&&& 在对DLL进行Build前,应在缺省的库文件基础上增加wsock32.lib、libcmtd.lib和libc d.lib三个库文件模块;而在对主程序进行Build时,还应增加所生成的相应DLL的*.obj目标文件模块,以及设备相应模块文件的搜索路径。&&& 在Windows Sockets的调试阶段,可在一台计算机上同时打开两个Windows Socket应用程序窗口进行试运行,待正常后再在两台不同机器上进行实验。即使计算机没有入网,也可以采用localhost的名字和127.0.0.1的IP地址进行应用程序Sockets的单机试调。&&& 五、在Internet网络中的实际应用&&& 虽然目前已有WWW浏览器、FTP等Internet互联网的应用工具,可以下装网上的信息,或实现网上工作站间的数据与文件传输,但是Windows Sockets则可方便地在用户自己设计的Win dwos视窗应用程序中通过Internet互联网传输数据,由于互联网的传输速度可以高达数十兆到数百兆bps,因此除了可以传递一般的文字、图形、声音等数据文件外,还可以用来传递实时的图像数据。&&& send()函数可由用户给定所发送数据祯(Frame)的长度,如果数据祯较长(数KB以上),在实际传输前,Socket要先将数据祯重新分成若干个数据包(Packets),再分别顺序传输,也就是说只要该祯数据没有接收完,接收一方Socket将不断驱动WM-READ消息直到接收完该祯数据。因此,应根据这一特点对所接收的数据进行相应处理。在实时传输时,还应由接收一方对传输过程控制……。&&& 附:作者简介&&& 裴纯礼,北京师范大学计算中心副主任、副教授,同时兼任国家教委高教司&全国普通高校文科专业计算机基础教育指导组&副组长、国家教委师范司&全国高等师范学校计算机教育指导组&委员、北京市教委大学处&北京地区普通高校计算机基础教育评价与指导委员会&委员等职,多年从事计算机基础教学工作,已出版有关计算机基础教材、著作200余万字,正式发表十余篇论文。1996年5月赴美进修,从事计算机网络通信与Wavelet的研究工作,现为美国俄亥俄州立大学电气工程系高级访问学者。热点技术
本分类共有文章18篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";csh,tcsh,bash,sh等shell的区别-shell_脚本专栏-脚本宝典
出自bash的faq,仔细看看。顺便翻译学习一下。 代码如下:
分享给好友:qzhijun 的BLOG
用户名:qzhijun
文章数:55
评论数:224
访问量:187794
注册日期:
阅读量:5863
阅读量:12276
阅读量:413584
阅读量:1101342
51CTO推荐博文
主要从以下几个方面进行bash入门级的总结:1、命令历史、命令补全2、管道、重定向3、命令别名和命令替换4、命令行编辑5、文件名通配6、Bash的相关配置文件及变量7、编程(条件判断、循环控制)8、bash中的数组9、shell编程技巧和编程规范1、命令历史、命令补全查看命令历史:history-c:清空命令历史-d OFFSET [n]: 删除指定位置的命令-w:保存命令历史至历史文件中,这对于经常在不同的终端上执行命令很有用命令历史的使用技巧:!n:执行命令历史中的第n条命令;!-n:执行命令历史中的倒数第n条命令; !!: 执行上一条命令;!string:执行命令历史中最近一个以指定字符串开头的命令!$:引用前一个命令的最后一个参数; Esc, .Alt+.命令补全,路径补全命令补全:搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于一个,两次tab,可以给出列表;否则将直接补全;路径补全:搜索我们给出的起始路径下的每个文件名,并试图补全;2、管道、重定向管道------前一个命令的输出,作为后一个命令的输入命令1 | 命令2 | 命令3 | ...如:cat /var/log/message |less & &find ./ -name ex* | xargs mv /backup& 覆盖输出&& 追加输出2& 重定向错误输出2&& 追加方式&& 重定向标准输出或错误输出至同一个文件& 输入重定向&& Here Document:& file 清空一个文件对于Here Document举个实例:cat && /etc/hosts && EOF172.28.9.172.28.9.172.28.9.172.28.9.EOF"*/5 * * * * /usr/sbin/ntpdate ntp.api.bz & /dev/null 2&&1/dev/null 2&&1 : 意思是将标准输出和错误输出全部重定向到/dev/null中3、命令别名和命令替换命令别名alias CMDALIAS='COMMAND [options] [arguments]'在shell中定义的别名仅在当前shell生命周期中有效;别名的有效范围仅为当前shell进程;ualias CMDALIAS对于我们设定别名的命令,如果要使用没有设定别名时的命令格式,即默认格式可以在命令前面加上: \\CMD对于别名我们还可以写在配置文件中:全局配置文件:/etc/bashrc用户配置文件:~/.bashrc命令替换: $(COMMAND), 反引号:`COMMAND`把命令中某个子命令替换为其执行结果的过程如:echo "The date time is : `date`"echo "The date time is : $(date +%F)"bash支持的引号:``: 命令替换"": 弱引用,可以实现变量替换'': 强引用,不完成变量替换4、命令行编辑光标跳转:Ctrl+a:跳到命令行首Ctrl+e:跳到命令行尾Ctrl+u: 删除光标至命令行首的内容Ctrl+k: 删除光标至命令行尾的内容Ctrl+l: 清屏5、文件名通配:globbing*: 任意长度的任意字符?:任意单个字符[]:匹配指定范围内的任意单个字符[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z][:space:]:空白字符[:punct:]:标点符号[:lower:]:小写字母[:upper:]: 大写字母[:alpha:]: 大小写字母[:digit:]: 数字[:alnum:]: 数字和大小写字母# man 7 glob[^]: 匹配指定范围之外的任意单个字符[[:alpha:]]*[[:space:]]*[^[:alpha:]]6、Bash相关配置文件及变量bash的配置文件:全局配置/etc/profile, /etc/profile.d/*.sh, /etc/bashrc个人配置~/.bash_profile, ~/.bashrcprofile类的文件:设定环境变量运行命令或脚本bashrc类的文件:设定本地变量定义命令别名登录式shell如何读取配置文件?/etc/profile --& /etc/profile.d/*.sh --& ~/.bash_profile --& ~/.bashrc --& /etc/bashrc非登录式shell如何配置文件?~/.bashrc --& /etc/basrc --& /etc/profile.d/*.sh关于环境变量命令介绍: 1.echo 显示某个环境变量值 echo $PATH 2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号) 3.env 显示所有环境变量 4.set 显示本地定义的shell变量 5.unset 清除环境变量 unset HELLO 6.readonly 设置只读环境变量 readonly HELLO常见的环境变量PATH:决定了shell将到哪些目录中寻找命令或程序 & HOME:当前用户主目录MAIL:是指当前用户的邮件存放目录SHELL:是指当前用户用的是哪种ShellHISTSIZE:是指保存历史命令记录的条数LOGNAME:是指当前用户的登录名HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量PS1:是基本提示符,对于root用户是#,对于普通用户是$PS2:是附属提示符,默认是“&”。可以通过修改此环境变量来修改当前的命令符位置变量:$1, $2, ...$n特殊变量:$?:上一个命令的执行状态返回值,echo $0结果如果为0表示成功,非0表示失败.$0:获取当前执行的shell脚本的文件名,通常结合basename使用$*:获取当前shell的所有参数,$1 $2 $3 ,注意与$#的区别$#:获取当前shell命令行中参数的总个数$$:获取当前shell的进程号(PID)$!:执行上一个指令的PID$@:这个程序的所有参数 "$1" "$2" "$3" "…"注意:有时候变量名很容易与其他文字混淆,比如我们在某个变量的值后面追加内容:num=2echo "this is the $numnd"这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:num=2echo "this is the ${num}nd"这将打印: this is the 2nd 变量名不能以数字开头!!!!!!!!!!!!!!!!+++++++++++++++++++++++++++++++++++++++++++++++++++++shell中如何进行算术运算:A=3B=61).let 算术运算表达式let C=$A+$B2).$[算术运算表达式]C=$[$A+$B]3).$((算术运算表达式))C=$(($A+$B))4).expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用C=`expr $A + $B`这些计算方法都是shell编程的基础!!!shell中关于字符串的简单操作:取字符串长度A="admin"echo ${$A} 或 expr length $A字符串的替换与删除操作:${变量#关键字}---------&若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除如:echo ${变量##关键字}---------&若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除${变量%关键字}---------&若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删${变量%%关键字}---------&若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除 ${变量/旧字串/新字串}---------&若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代${变量//旧字串/新字串}---------&若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代7、编程(条件判断、循环控制)下面总结下条件测试类型整数测试字符测试文件测试条件测试的表达式:[ expression ][[ expression ]] &-----在Bash高版本中基本上只能用这个高级的了...上面那个会报错!test expression整数比较:-eq: 测试两个整数是否相等;比如 $A -eq $B-ne: 测试两个整数是否不等;不等,为真;相等,为假;-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;-ge: 大于或等于-le:小于或等于间逻辑关系:逻辑与: && 第一个条件为假时,第二条件不用再判断,最终结果已经有; 第一个条件为真时,第二条件必须得判断;逻辑或: ||注意:[ 条件1 -a 条件2 ] &等价于 [ 条件1 ] && [ 条件2 ] 还有一点要注意:可以[[ 条件1 && 条件2 ]]这样使用不可以[ 条件1 && 条件2 ]这样使用字符测试:==:测试是否相等,相等为真,不等为假!=: 测试是否不等,不等为真,等为假\& \&-n string: 测试指定字符串是否为空,空则真,不空则假-z string: 测试指定字符串是否不空,不空为真,空则为假string ="" &字符串为空string !="" 字符串不为空文件测试: -e FILE:测试文件是否存在-f FILE: 测试文件是否为普通文件-d FILE: 测试指定路径是否为目录-s FILE: 判断文件是否存在且大小大于0-r FILE: 测试当前用户对指定文件是否有读取权限-w FILE: 文件是否可写-x FILE: 文件是否可执行再简单说下脚本退出状态码exit: 退出脚本exit #如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;通常:# 是 0 表示正常退出# 非 0 表示错误退出+++++++++++++++++++++++++++++++++++++++++++++++++条件判断--if单分支if语句if 判断条件; then &statement1 &statement2 &...fi双分支的if语句:if 判断条件; thenstatement1statement2...elsestatement3statement4...fi多分支的if语句:if 判断条件1; then &statement1 &...elif 判断条件2; then &statement2 &...elif 判断条件3; then &statement3 &...else &statement4 &...fi++++++++++++++++++++++++++++++++++++++++++++++++++++++++++选择结构--casecase SWITCH in value1) &statement &... &;;value2) &statement &... &;;*) &statement &... &;;esac说明:value1) 是正则表达式样式,可以用下面字符: * 任意长度的字符串 C* 表示以C字符开头的字符串 ? 任意单个字元,???? 表示4个字符的字符串 [abc] a, b, 或c三字元其中之一,如:[abc]123,匹配a123或b123或c123。 [a-n] 从a到n的任一字元 | 多重选择,分隔符+++++++++++++++++++++++++++++++++++++++++++++循环控制---for两种用法:for 变量 in 列表; do 循环体donefor (( expr1 ; expr2 ; expr3 )); do
循环体done循环控制---whilewhile CONDITION; do statmentdone进入循环:条件满足退出循环:条件不满足while的特殊用法一(死循环):while :; do statmentdonewhile的特殊用法二(从某个文件中读取行):while read LINE; do statmentdone & /PATH/TO/SOMEFILE方法二另外一种写法:cat ip.txt | while read linedo echo $linedone循环控制---untiluntil跟while相反,可参照whileuntil CONDITION; do statement ...done判断条件是否成立,不成立就执行循环体,成立就退出!循环控制语句break中断循环,而后执行循环后面的语句;默认是跳出一层循环,如果要跳出多层循环,可以用 break n(n是大于1的数字,也就次数)。continue中断当前这一次循环,提前进入下一次循环,默认跳过一层循环,如果要跳过多层循环,可以用 continue n(n是大于1的数字,也就次数)。++++++++++++++++++++++++++++++++++++++++++++++++++++++select (产生菜单选择)select 表达式是一种bash的扩展应用,尤其擅长于交互式使用,用户可以从一组不同的值中进行选择.select 命令可以建立简单的列表,结构类似for循环,一般与case语句结合使用。下面写一个实例:#!/bin/bashecho "What is your favourite OS?"select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do breakdoneecho "You have selected $var"8、bash中的数组使用数组赋值方式:(1) array=(var1 var2 var3 ... varN) & (2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN) & (3) array[0]=var1 & & &
& &arrya[1]=var2 & & &
& &... & & &
& &array[n]=varN注意:shell中数组的下标默认是从0开始的!获取数组元素个数或者长度: (1) ${#array[@]} & & & (2) ${#array[*]}显示数组元素:echo ${array[*]} &#显示所有元素echo ${array[@]}echo ${array[@]:0}echo ${array[0]} &#显示第一个元素echo ${array[@]:2} #不显示数组中前两个元素echo ${array[@]:0:2} &#从第一个元素开始显示两个元素删除数组中的元素:unset array[2] #删除第三个元素unset array & &#删除整个数组子串删除:echo ${array[@]#t*e} &# 左边开始最短的匹配:"t*e",这将匹配到"thre"echo ${array[@]##t*e} # 左边开始最长的匹配,这将匹配到"three"echo ${array[@] %o} & # 从字符串的结尾开始最短的匹配echo ${array[@] %%o} &# 从字符串的结尾开始最长的匹配子串替换:echo ${array[@] /o/m} &#第一个匹配到的,会被删除echo ${array[@] //o/m} #所有匹配到的,都会被删除echo ${array[@] //o/} &#没有指定替换子串,则删除匹配到的子符echo ${array[@] /#o/k} #替换字符串前端子串echo ${array[@] /%o/k} #替换字符串后端子串循环列出数组元素:#!/bin/basharr=(ab bc cd)lenarr=${#arr[@]}for (( i=0; i&$lenarr}; i++ )); do & &
&echo ${arr[$i]}done#!/bin/basharr=(ab bc cd)lenarr=${#arr[@]}i=0while [[ $i -lt $lenarr ]]do &echo ${arr[$i]} &let i++done一个实例:#!/bin/bash# 设置IFS将分割符 设置为 换行符(\n) & OLDIFS=$IFSIFS=$'\n'# 读取文件内容到数组fileArray=($(cat file.txt)) & & & # restore it & IFS=$OLDIFS & tLen=${#fileArray[@]} & & & # 循环显示文件内容 & for (( i=0; i&${tLen}; i++ )); do & &
&echo "${fileArray[$i]}" &done9、shell编程技巧和编程规范检测语法相关:bash -n 脚本名命令追踪:bash -x 脚本名shell输入和输出中:read 用法cat 特殊用法echo 特殊用法后台执行命令:& nohup如果正在运行一个进程,而且觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。Nohup就是不挂起的意思( no hang up)。 nohup命令的一般形式为nohup command &shift 用法..........................后面略!简单说下编程规范:1.文件注释说明在编写的每个脚本文件中,应当包含文件注释、脚本用途简单描述、版本、作者等...如:#!/bin/bash#Description: .......#Date: xxxx-xx-xx#Version: ....#Author: Andy2.代码注释3.函数注释--说明该函数的功能4.变量命名规范化取名要说明这个变量代表的含义变量名或函数名不要太长名称尽量使用大写或大写开头如:PasswdNum_Count5.代码注意缩进本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
10:55:48 10:58:21 14:19:53 14:37:48 19:53:19 22:28:44 22:29:05 22:29:18 00:24:41 09:38:11 11:33:46 18:19:28 20:42:54 21:20:46 12:28:33}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信