shell编程(1)——基本shell脚本编程基本shell编程导言变量及相关命令结构与流程控制一、什么是shell脚本UNIXshellUNIX系统程序,用于用户命令的解释与执行拥有自己的编程语言,用于完成复杂的管理任务shell脚本由shell编程语言编写的程序解释执行UNIX系统本身有大量的shell脚本,进行系统管理不同的shell有不同的脚本语法,只能运行自己的脚本二、运行shell脚本三种运行方式直接执行:在shell下键入脚本名称需要用户拥有脚本的可执行权限脚本为当前shell的脚本运行sh命令(Linux下是bash),以脚本为参数强制当前shell执行脚本(不管是否类型匹配)需要在脚本头部加上#!/bin/sh来实现脚本当普通命令执行,需要用户可执行权限基本shell编程导言变量及相关命令结构与流程控制一、变量shell变量被赋予了名称的主存单元,因而可以通过对变量名的引用访问特定内存空间在脚本程序中的作用与普通程序中的变量类似无类型,值均被当作字符串两种类型环境变量:用户自定义变量:二、环境变量环境变量用于设置shell的运行环境,并保证shell命令的正确执行每个shell子进程都拥有所有shell环境变量的拷贝公共的环境变量在启动文件/etc/.profile(Linux下为/etc/profile)中设置用户也可以在自己主目录下的.profile(Linux为.bash_profile)设置私有环境变量环境变量环境变量含义PATHshell搜索外部命令或程序的目录ENVUNIX查找配置文件的目录HOME用户登录的主目录CDPATHcd命令搜索的路径TERM用户控制终端的类型EDITOR默认编辑器…重要的shell环境变量环境变量大部分环境变量是可读写的,但是有一些变量是只读的环境变量含义$0程序名$1-$9第1到第9个命令行参数的值$*所有命令行参数的值$@所有命令行参数的值$#命令行参数的总数$$当前进程的进程ID$?最近一条命令的退出状态$!最近后台进程的进程ID三、用户自定义变量自定义shell变量拥有临时存储空间脚本程序执行过程中可以改变无需声明和初始化(空串nullstring)四、变量的访问查看环境变量设置set命令[penglizhi@localhost~]$setBASH=/bin/bashBASH_ARGC=()BASH_ARGV=()BASH_LINENO=()BASH_SOURCE=()…[penglizhi@localhost~]$env命令功能与set命令一样SystemV支持变量的访问变量赋值variable1=v1variable2=v2,…variableN=vN例:$name=Petersex=maleage=20注:如果值中含有空格,则需要使用引号变量的读取(引用)变量名前面加$符号例:$echo$name变量的访问导出环境变量当一个变量创建或修改后,不会被后面的进程所知,就产生了导出的问题export命令传递一个或者多个变量的值到任何后继的脚本(进程)命令格式:export[name-list]变量的访问export命令例$catdisplay_nameecho$nameexit0$name=“JohnKennedy”$echo$nameJohnKennedy$display_name$exportname$display_nameJohnKennedy$变量的访问变量重置将变量重置为nullstring(空串)使用unset命令unset[name-list]变量的访问读取标准输入对变量赋值的方法命令行静态赋值脚本程序的赋值语句(与静态赋值一样)用户从标准输入交互式输入从标准输入对变量进行赋值命令格式:readvariable-list五、命令替换命令替换当一个命令使用反引号“``”括起来时,shell会首先执行该命令,并以其返回结果取代该命令例:$echolsls$echo`ls`aaa.txtabca.txt~b.txtcommon.mk…$基本shell编程导言变量及相关命令结构与流程控制一、注释与程序头注释良好的程序都应该有准确详细的注释UNIX脚本使用#作为注释标记程序头位于程序开始部分的说明性注释文字一般应该包含脚本文件名作者创建日期程序功能解决的问题及采用的算法简单描述二、条件判断if语句(二分支判断)语法ifexpressionthen[elifexpressionthenthen-command-list][elseelse-command-list]fi条件判断ifexpressionthen-commandsfielse-commandstruefalse条件判断expression(表达式)的值用test命令计算命令格式:test[expression]例:iftest–f“$1”thenrm–f$1fi条件判断表达式说明表达式说明表达式说明-dfile测试file是否为目录int1–eqint2int1是否等于int2strstr是否为空-ffile测试file是否为普通文件int1–geint2int1是否大于等于int2str1=str2str1是否与str2相同-rfile测试file是否可读int1–gtint2int1是否大于int2str1!=str2str1是否与str2不相同-sfile测试file长度是否为零int1–leint2int1是否小于等于int2-nstrstr长度是否大于零-wfile测试file是否可写int1–ltint2int1是否小于int2-zstrstr长度是否等于零-xfile测试file是否可执行int1–neint2int1是否不等于int2test命令用法条件判断逻辑表达式运算符-a:逻辑与-o:逻辑或!:逻辑非():表达式分组条件判断示例脚本filedemo#!/bin/shiftest$#-ne1thenecho“Usage:$0Ordinary_file.”exit1fiif(test–r$1)–a(test–s$1)thencat$1fi三、循环for语句语法:forvariable[inarg-list]docommand-listdone功能:对循环变量variable,逐一对其赋以arg-list集合中的值,并执行command-list(循环体)循环doarg-list中还有元素?arg-list中下一个值赋予variabledonecommand-listfor否是循环示例#!/bin/shforpeopleinplzwlsryzldoecho$peopledoneexit0循环while语句语法:whileexpressiondocommand-listdone功能:只要expression值为真,执行command-list中的命令循环示例#!/bin/shpassword=ujnecho“Guessthepassword!”echo“Enteryourpassword:\c”readyour_pwdwhile[$your_pwd!=$password]doecho“Wrongpassword!”echo“Enteryourpassword:\c”readyour_pwddoneecho“Youareagenius!”exit0循环continue与break语句continue:忽略后面的执行语句,进入下一轮循环break:提前结束循环与c语言的continue与break的功能一致四、test命令另一种表达方式test命令还可以用下一形式表示[expression]例如test$1–lt3[$1–lt3]test$#-eq2[$#-eq2]