一、简介

1.bash脚本是什么?
bash是一个为GNU计划编写的Unix shell。它是一些命令的堆积,配合简单的语法组成。

二、基础知识

1.脚本调试
1)bash -n /path/to/some_scripts 检测脚本语法错误 如:bash -n test.sh 
2)bash -x /path/to/some_scripts 调试执行        如:bash -x test.sh      
2.变量
变量:命名的内存空间数据存储方式:
字符: 数值:整型,浮点型 变量:变量类型
作用: 1、数据存储格式 2、参与的运算 3、表示的数据范围
类型: 字符数值:整型、浮点型
变量命名规则:
变量命名法则: 1、不能使程序中的保留字:例如if, for; 2、只能使用数字、字母及下划线,且不能以数字开头 3、见名知义 4、统一命名规则:驼峰命名法
2.bash变量种类:
根据变量的生效范围等标准:
本地变量:生效范围为当前shell进程;对当前shell之外 的其它shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程 
局部变量:生效范围为当前shell进程中某代码片断(通常 指函数)
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, $@, $#
变量赋值:name="value"
(1) 可以是直接字串;name=“root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND`,name=$(COMMAND)
变量引用:${name}, $name
"":弱引用,其中的变量引用会被替换为变量值
'':强引用,其中的变量引用不会被替换为变量值,而保 持原字符串 
显示已定义的所有变量:set
删除变量:unset name

环境变量:

变量的声明、赋值:export name=value declare -x name=value 
变量引用:$name,${name}
显示所有的环境变量:export,env,printenv   
删除:unset name,有许多内建的环境变量:PATH, SHELL,USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

只读变量:只能声明,不能删除和修改

readonly name  
declare -r name  
declare -rx name

位置变量:

在脚本中调用通过命令行传递给脚本的参数

$1, $2, ...:对应第1、第2等参数,shift [n]换位置
$0:脚本名称
$*:传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,全部参数为独立字符串
$#:传递脚本的参数的个数
$@,$*只对被双引号包起来的时候会有差异

算术类型:

bash中的算术运算:
help let +, -, *, /, %取模(取余), **(乘方) 
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc

赋值:

1)增强型赋值
+=,-=,*=,/=,%= 
2)自增,自减 
let var+=1 let var++  let var--

逻辑运算 

与: 1 与 1 = 1 1 与 0 = 0 0 与 1 = 0 0 与 0 = 0  或: 1 或 1 = 1 1 或 0 = 1 0 或 1 = 1 0 或 0 = 0 非:! ! 1 = 0 ! 0 = 1 true, false 1, 0 
短路运算: 短路与: 第一个为0,结果必定为0; 第一个为1,第二个必须要参与运算; 短路或: 第一个为1,结果必定为1; 第一个为0,第二个必须要参与运算;  异或:^ 异或的两个值,相同为假,不同为真

聚集命令:

有两种聚集命令的方法:  复合式:date;  who |  wc  -l 命令会一个接一个地运行  子shell:(date;  who | wc -l ) >>/tmp/trace 所有的输出都被发送给单个STDOUT和STDERR

退出状态:

1)0表示成功,1-255表示失败  
2)$?测试最后一条命令执行的状态结果

退出状态码:

bash自定义退出状态码 
exit [n]:自定义退出状态码; 
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出 状态取决于exit命令后面的数字 
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码 取决于脚本中执行的最后一条命令的状态码
exit 3 eixt 1 exit 2...表示执行错误退出。

条件测试:

 判断某需求是否满足,需要由测试机制来实现; 专用的测试表达式需要由测试命令辅助完成测试过程; 评估布尔声明,以便用在条件性执行中 若真,则返回0  若假,则返回1 
测试命令:
test expression  
[ expression ]
[[ expressison ]]

bash的数值测试:

-gt: 是否大于; -ge: 是否大于等于; -eq: 是否等于; -ne: 是否不等于; -lt: 是否小于; -le: 是否小于等于;

字符串测试:

==:是否等于; >: ascii码是否大于ascii码 <: 是否小于 !=: 是否不等于 =~: 左侧字符串是否能够被右侧的PATTERN所匹配 注意: 此表达式一般用于[[  ]]中; 
-z "STRING":字符串是否为空,空为真,不空为假  zero
-n "STRING":字符串是否不空,不空为真,空为假  nozero
注意:用于字符串比较时的用到的操作数都应该使用引号

文佳测试:

-a,-e file:文件存在性测试,存在为真,不存在为假的, 
-b file:是否为块状设备
-c file:是否为字符设备 
-d file:是否为目录
-f file:存在的文件 
-h FILE 或 -L FILE:存在且为符号链接文件; 
-p FILE:是否存在且为命名管道文件; 
-S FILE:是否存在且为套接字文件;

组合测试条件:

 第一种方式: COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND   非 如:[ -e FILE ] && [ -r FILE ] 
 第二种方式: EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 必须使用测试命令进行;

本文转自chengong1013 51CTO博客,原文链接:http://blog.51cto.com/purify/1836818,如需转载请自行联系原作者