bash脚本编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash脚本编程相关的知识,希望对你有一定的参考价值。
(一)、变量、变量类型shell编程:
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:
编译型语言,强类型(使用前必须先声明,甚至需初始化,数值-0,字符串-NULL),事先转换成可执行格式,C、C++、JAVA、C#
动态语言:
解释型语言,弱类型(变量用时声明,可直接用,甚至不区分类型,默认为字符串类型),边解释边执行,php、shell、Python、Perl
面向过程:shell、C
控制结构
顺序结构
选择结构:
if语句:单分支、双分支、多分支
循环结构
面向对象:JAVA、Python、Perl、C++
变量:命名的内存空间
内存:编址的存储单元
变量赋值:[set] VAR_NAME=VALUE
撤销变量:unset VAR_NAME
变量名称:
只能包含字母、数字和下划线,并且不能以数字开头;
不应该跟系统中已有的环境变量重名;
最好做到见名知意
查看当前shell中变量:set
查看当前shell中环境变量:printenv,env,export
变量类型:事先确定数据的存储格式和长度
字符型:每一个字符都是一个ASCII码(范围为000-255),一个ASCII码长度为8位即一个字节
数值型:整型、浮点型
布尔型:ture/false
逻辑运算:与&、或|、非!、异或
溢出:溢出的部分可能占用其他程序的内存,导致其他程序无法正常运行。所以需要通过变量类型来判断是否溢出
bash变量类型:
环境变量
定义方法:export VAR_NAME=VALUE(导出),作用域为当前shell进程及其子进程
本地变量(局部变量)
本地变量:VAR_NAME=VALUE,作用域为整个bash进程
局部变量:local VAR_NAME=VALUE,作用域为当前代码段
引用变量:${VAR_NAME}({ }可省略,引用过程中需要变换变量内容时{ }不能省略)
位置变量:
$1,$2,...$n(脚本执行时其后所跟的第n个参数)
shift [n]:轮替,默认轮替单位为1
特殊变量:bash内置的,用来保存某些特殊数值的变量
$?:上一个命令的执行状态返回值
程序执行,可能有两类返回值:
˙程序执行结果
˙程序状态返回代码(0-255):0-正确执行,1-255-错误执行(1,2,127系统预留)
# exit 错误码:退出脚本(错误码自定义)
$#:参数个数
$*:参数列表
[email protected]:参数列表
$0:当前执行shell脚本的程序名
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令启动)就需要自我定义各环境变量
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
(二)、条件判断(if语句)
bash中如何实现条件判断?
条件测试类型:
整数测试
逻辑测试
字符测试
文件测试
条件测试的表达式:(expression代表条件测试内容,即数值比较)
[ expression ]
` expression `
test expression
条件测试:
整数比较:(双目操作) -eq:相等 -ne:不等 -gt:大于 -lt:小于 -ge:大于或等于 -le:小于或等于 | 文件测试: -e FILE:测试文件是否存在 -s FILE:测试文件是否非空 -f FILE:测试文件是否为普通文件 -d FILE:测试指定路径是否为目录 -r/w/x FILE:测试当前用户对指定文件是否有读/写/执行权限 -b/c/L/p/S FILE:测试指定文件是否为块设备/字符设备/符号链接/管道/套接字文件 -u/g/k FILE:测试文件是否拥有SUID/SGID/SBIT权 |
命令间的逻辑关系: 逻辑与:&&,前者为真时才执行后者,前者为假时不执行后者(如果...就...) 逻辑或:||,前者为真时不执行后者,前者为假时才执行后者(如果不...就...) 命令1 && 命令2 || 命令3:如果命令1成立,则执行命令2,否则执行命令3 | |
字符串测试: ==:等于 !=:不等 >/<:大于/小于 -n string:测试指定字符串是否为空 -s string:测试指定字符串是否不空 |
条件判断,控制结构:(非0值对于if语句来说都为假)
单分支if语句 | 双分支if语句 | 多分支if语句 |
if 判断条件 then statement1 statement2 ... fi | if 判断条件;then statement1 ... else statement2 ... fi | if 判断条件1;then statement1 ... elif 判断条件2;then statement2 ... else statement3 fi |
测试脚本是否有语法错误:# bash -n SH_NAME
有时错误无法检测出来:# bash -x SH_NAME (单步执行,详细列出所执行的脚本过程,便于分析)
shell中如何进行算数运算:A=3,B=6
let 算数运算表达式 let C=$A+$B
$[算数运算表达式] C=$[$A+$B]
$((算数运算表达式)) C=$(($A+$B))
expr 算数运算表达式 表达式中各操作数及运算符间要有空格,且要使用命令引用
C=`expr $A + $B` C=$(expr $A + $B)
(三)、循环结构(for语句)
循环:进入条件、退出条件
for、while、until
for循环 | while循环:适用于循环次数未知的场景 | until循环 |
for 变量 in 列表;do 循环体 done (遍历完成之后退出) for (( expr1 ; expr2 ; expr3 ));do 循环体 done | while CONDITION;do statement ... done (条件满足就循环,不满足就退出) | until CONDITION;do statement ... done (条件不满足就循环,满足就退出) |
while的特殊语句:
while :;do while read LINE;do
语句 语句(每次执行/path/to/somefile文件中的一行)
done(不停止循环) done < /path/to/somefile
如何生成列表:
`seq 起始数 步长 结束数`
quit:退出脚本
break:提前退出循环
continue:提前结束本轮循环体而进入下一轮循环
(四)、组合测试条件
-a:与关系
-o:或关系
!:非关系
if [ $# -lt 8 -a $# -gt 1 ]等同于if [ $# -lt 8 ] && [ $# -gt 1 ]
(五)、多分支条件测试(case语句)
case SWITCH in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac
(六)、函数
函数:功能,function
实现代码重用
库 .so
定义一个函数:
function FUNCNAME { command } | FUNCNAME() { command } |
自定义执行状态返回值:
return #(0-255)
※条件语句可以直接接收COMMAND,无需加反引号,加反引号输出的是echo信息;不加反引号代表直接判断命令的状态信息,即返回信息($?),0代表真,非0为假。
(七)、脚本编程知识点
变量中字符的长度:
${#VARNAME}
变量赋值:
${parameter:-word}:如果parameter为空或未定义,则变量展开为"word";否则,展开为parameter的值
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,展开为"word"值
${parameter:=word}:如果parameter为空或未定义,则变量展开为"word",并将展开后的值赋值给parameter
${parameter:offset}:取子串,从offset处的后一个字符开始,取全部剩余子串
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取length长的子串
脚本配置文件:
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:
/etc/sysconfig/服务脚本同名的配置文件
局部变量:
local VAR_NAME=
命令mktemp:创建临时文件或目录
# mktemp /tmp/file.XXX
-d:创建为目录
信号:
# kill -SIGNAL PID (向PID进程发送SIGNAL信号)
1:HUP
2:INT
9:KILL
15:TERM
脚本中,能实现信号捕捉,但9和15无法捕捉
# trap 'COMMAND1;COMMAND2;...' 信号列表
一行执行多个语句,语句间用分号分隔
以上是关于bash脚本编程的主要内容,如果未能解决你的问题,请参考以下文章
linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论