1、运维技术分享之SHELL篇2016/08/12SHELL种类 (1)/bin/shB-shell由R.Bourne在Bell实验室开发,Unix的标准Shell(2)/bin/cshC-shell由Bill Joy在加州大学开发,提供历史机制和别名替换(3)/bin/bashBourne Again ShellLinux标准Shell,其兼容B-Shell。Shell的选择:Shell一般由管理员在创建用户时,为用户指定;其保存在/etc/passwd文件中;或通过usermod命令进行更改。也可在登录后执行相应的命令切换Shell。BASH的启动与终止启动:启动:BashBash启动时,先运
2、行启动时,先运行/ /etcetc/profile/profile、/etc/bashrc/etc/bashrc,再自动运行用户主目录下,再自动运行用户主目录下的的. .bash_profilebash_profile和和. .bashrcbashrc文件。文件。终止:当用户执行终止:当用户执行exitexit、logoutlogout或按下或按下ctrlctrld d 时,时,BashBash将运行用户主目录下的将运行用户主目录下的. .bash_logoutbash_logout文件中文件中的命令。的命令。输入/输出命令echo-显示命令echo option string将string的
3、内容按照option指定的方法送到屏幕上进行显示-n输出后不换行-e对字符串中的特殊字符进行翻译特殊字符a响铃n换行t跳格位置参数位置参数及引用位置参数也称为命令行参数,即:组成命令行的所有元素。在Shell脚本中通过$0、$1.进行引用位置参数。为位置参数赋值set 参数值列表位置参数移动shift n 将位置参数(除$0)右移n个位置,默认为1。SHELL预定义特殊变量变量名变量名含义含义$?最后一次执行命令的返回码$当前脚本自己的PID$!脚本进程最近启动的后台进程的PID$#命令行参数的个数$0脚本文件本身的名字$1,$2第一、第二个命令行参数“$*”将所有命令行参数作为一个整体单词看
4、待“$”将命令行参数作为多个单词看待IF结构if条件/命令then commandlistelif 条件/命令then commandlistelsecommandlistfi#!/bin/bash#!/bin/bashecho -n enter filename:echo -n enter filename:read read fnamefnameecho enter words:echo enter words:read wordsread wordsecho $words 2/dev/null $echo $words 2/dev/null $fnamefnameif $? if $?
5、eqeq 0 0 then thenecho Write successfullyecho Write successfullyelseelseecho write errorecho write errorfi fiCASE结构case word incase word inpattern1pattern1)command_listcommand_list; ;pattern2pattern2) command_listcommand_list; ; * *) command_listcommand_list; ; esacesac其中:其中:patternpattern可以用竖线分隔多个模
6、式,模式使用可以用竖线分隔多个模式,模式使用shellshell的文件名匹配规的文件名匹配规则。则。WHILE循环while conditionwhile conditiondodocommand_listcommand_listdonedone#!/bin/shcount=3while $count -gt 0 doecho -en Login name:read lognameecho -en Password:read pwd $logname = root -a $pwd = 12345 & echo Welcome Here!count=0let count=count - 1 sl
7、eep 5 doneUNTIL循环until conditiondoCommandListdoneFOR循环格式格式1 1:for for varvar in in word_listword_listdodocommand_listcommand_listdonedonefor for varvar in $1 $2 in $1 $2 dodocommand_listcommand_list donedone从从shellshell的位置变量中取值的位置变量中取值例#!/bin/bashecho -e please enter vars like var1 var2 .necho They
8、are:read varfor i in $vardo echo $idoneFOR循环格式2:for var in Path/*docommand Listdone遍历Path目录中的所有文件及文件夹FOR循环格式3:for (e1;e2;e3)do 命令列表done语法同C中的ForBREAK、CONTINUE、EXITBreak n 退出 n 层循环continue n 跳到第n层循环继续exit n 退出脚本,并设置退出码SELECTselect一般用于设计菜单。select显示一组菜单项、显示一个输入提示并读入用户输入的菜单编号。select var in wordsdo语句done
9、select的提示符由“PS3”决定。select 一般和case配合使用函数格式:function_name() command_list return n其中return用于带回函数的返回码(0255)注意:函数必须先定义后使用函数在当前环境下运行,和调用它的脚本共享变量;而且可以通过把变量作为定位参数来赋值的方式传递变量。SHELL 内置命令eval命令分析eval 命令字符串功能:首先对“命令字符串”进行shell替换,然后执行该命令。例:for(i=1;i=$#;i+)doeval echo $i. $idone内置命令 DECLARE内置命令 declare 可用来创建变量。dec
10、lare 选项 variable=valueSHIFT命令一般用于函数或者脚本程序参数处理,特别是参数多于10以上的时候将所有参数变量向下移动一个位置,$2变成$1,$3变成$2,依次递进,但$0保持不变例如:while “$1 != ” ;do echo $1 shiftdoneTRAP命令command一般情况下是Linux命令 表示发生陷阱时为空指令,不做任何动作-表示发生陷阱时采用缺省指令常见信号SHELL内置命令总结内置命令内置命令命令说明命令说明echo输出一行文本到标准输出设备read从标准输入设备读入数据printf格式化输出declare定义或创建变量或数组let让未定义的变
11、量参与算术运算expr执行表达式shift把所有参数变量向下移动一个位置eval执行命令trap用来定义接收OS信号后而采取的动作exit退出SHELL程序sleep休眠test条件测试网络编程/dev/tcp & /dev/udp:这两个神奇的目录为bash编程提供了一种可以进行网络编程的功能。在bash程序中使用/dev/tcp/ip/port的方式就可以创建一个scoket作为客户端去连接服务端的ip:port。我们用一个检查http协议的80端口是否打开的例子来说明它的使用curl和wget命令#!/bin/bashipaddr=127.0.0.1port=80if ! exec 5 /dev/tcp/$ipaddr/$portthenexit 1fiecho -e GET / HTTP/1.0n &5cat &5脚本调试sh x 脚本名该选项可以使用户跟踪脚本的执行,此时 shell 对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell 显示脚本中的行时,会在行首添加一个加号 “ + ”。sh v 脚本名在执行脚本之前,按输入的原样打印脚本中的各行。sh n 脚本名对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容。