bash脚本编程:
????脚本程序:解释器解释执行;
- 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下
- 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)
???????????? 流程控制语句;
???????????????? 顺序执行;
???????????? 循环执行;
???????????????? 选择执行;
2. ????????bash变量是弱类型;默认字符型;
?
????????变量引用:${VAR_NAME}
????????引号:
????????????弱引用:" " //可以实现变量的替换
????????????强引用:‘ ‘ //不可完成变量替换
????????????命令引用: ` `
3.
????????声明某变量为整型变量:
????????????let VAR_NAME=VALUE
????????????declare -i VAR_NAME=VALUE
如:在脚本想声明 变量sum为整型,并且给其赋值为0
???????????????? declare -i sum=0
?
????????声明某变量为环境变量:
????????????export VAR_NAME=VALUE
????????????declare -x VAR_NAME=VALUE
如:
????????????export -i sum=0
4. 脚本的编写格式:
????第一行:写明解释器; #!/bin/bash
????注释行:所有以#开头的行均为注释行;会被解释器忽略;
?
????执行脚本:
????????赋予执行权限;指明路径执行;
????????直接传递脚本给bash解释器
?
????????bash的选项:
????????????-n: 测试脚本中是否有语法 错误;
????????????-x: 调试执行;
5 . 算术运算:
????????$[EXPRESSION]
????????let VAR_NAME=EXPRESSION
????????$((EXPRESSION))
????????$(expr argu1 argu2 argu3)
????5.1 例 a=1,b=2 求 a+b?
?
????第一种方法:
????????[[email protected] ~]# a=1
[[email protected] ~]# b=2
[[email protected] ~]# echo $[a+b]
3
- 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)
????????第二种方法:let 命令的用法
????????????????????格式:
????????????????????let 赋值表达式
????????????????【注】let 赋值表达式功能等同于:((赋值表达式))
????????????5.2????范例 1:给自变量 I 加5
????????????????????????[[email protected] ~]$ i=2
[[email protected] ~]$ let i=i+5
[[email protected] ~]$ echo $i
7
==>去掉 let 定义
[[email protected] ~]$ i=i+5
[[email protected] ~]$ echo $i
i+5
提示: let i=i+5 等同于 ((i=1+5)),但后者效率更高
????????????5.3????范例2 :利用let计数监控web服务状态的小项目(如果看不懂,可以跳过去,这个只是提升题)
????#########################################################################
# File Name: _server_monitor.sh
# Author: changsheng
# mail: [email protected]
# Created Time: Fri 05 Dec 2014 03:48:07 PM CST
#########################################################################
#!/bin/bash
#监控服务状态
ServerMonitor(){
????#服务状态监控
????timeout=10
????fails=0
????success=0
????while true
????do
????/usr/bin/wget --timeout=$timeout --tries-1 http://172.16.0.1/ -q -O /dev/null
????????if [ $? -ne 0 ]
????????then
????????????let fails=fails+1
????????????success=0
????????else
????????????fails=0
????????????let success=1
????????fi
????????if [ $success -ge 1 ]
????????then
????????????exit 0
????????fi
????????if [$fails -ge 2 ];then
????????????Critical=" TMS 应用服务出现故障,请紧急处理!! "
????????????echo $Critical | mutt -s " 服务 down " www.magedu.com
????????????exit
????????fi
????done
?
}
?
6. 以空格为分割,打印1-10之间的数字:
????????[[email protected] test-scripts]# seq -s " " 10
1 2 3 4 5 6 7 8 9 10
注解: -s 是指定分隔符
7. shell 的特殊变量
????如下图所示:
????????
?
?
????????7.1 $* 和[email protected]区别例子:
???????????????? $* 将所有的命令行的所有参数视为单个字符串,等同于"$1$2$3
???????????? [email protected] 将命令行的每个参数视为单独的子串,等同于"$1" "$2" " $3".这是将参数传递给其它程序的最佳方式,因为他会保留所有内嵌在每个参数的任何空白。
实战演示:
[[email protected] test-scripts]# set -- "I am" handsome boy #===》传入三个参数
[[email protected] test-scripts]# echo $# #==è现在有三个参数
3
[[email protected] test-scripts]# for i in $*;do echo $i;done #循环打印这些参数用$*,无引号
I
am
handsome
boy
[[email protected] test-scripts]# for i in [email protected];do echo $i;done #没有引号的情况下和$*结果一样
I
am
handsome
boy
[[email protected] test-scripts]# for i ;do echo $i;done #--无in变量列表,相当于 in "[email protected]"
I am
handsome
boy
[[email protected] test-scripts]# for i in "[email protected]";do echo $i;done #------在有双引号的情况下,参数里引号内内容当做是一个参数输出了,这才是符合我们传入参数的要求set – "I am" handsome boy .
I am
handsome
boy
[[email protected] test-scripts]# for i in "$*";do echo $i;done #--加了双引号,$*表示一个字符串
I am handsome boy
[[email protected] test-scripts]# shift #---用shift 去掉第一个参数
[[email protected] test-scripts]# echo $#
2
[[email protected] test-scripts]# for i in "[email protected]";do echo $i;done #--再次打印只剩后面的参数
handsome
boy
?
8.变量子串的常用操作
????我来为朋友们举例说明:
定义changsheng变量,内容为"I am chang sheng "
[[email protected] etc]# changsheng="I am chang sheng"
[[email protected] etc]# echo ${changsheng}
I am chang sheng????
- 返回字符串changsheng变量字符串的长度
[[email protected] ~]# echo ${#changsheng}
16
?
2)截取changsheng变量字符串从第二个字符之后开始取,默认取后面字符的全部,第2个字符不包括在内。????????也可以理解为删除前面的多少字符
[[email protected] ~]# echo ${changsheng:2}
Am chang sheng
?
?
3)截取changsheng变量字符从第二个字符之后,取两个字符。
[[email protected] ~]# echo ${changsheng:2:2}
am
提示:类似 cut –c 参数
[[email protected] ~]# echo ${changsheng}|cut -c 1-4
I am
[[email protected] ~]# echo ${changsheng}|cut -c 3-4
am
?
?
4)从变量$changsheng开头开始删除最短匹配"I am " 子串
[[email protected] ~]# echo ${changsheng#I am}
Chang sheng
?
?
5)从变量$changsheng开头开始删除最长匹配"I am chang子串"
[[email protected] ~]# echo ${changsheng##I am chang}
Sheng
6) ????${var%word*}: 自右而左,删除第一次word出现处的字符开始直到尾部的所有字符;
????????????${var%%word*}:自右而左,删除最后一次word出现处的字符开始直到尾部的所有字符;
?
系统脚本里的实例:
[ -z "${COLUMNS:-}" ] && COLUMNS=80
?
?
[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)"
?
?
下面依次举例说明:
(1)${value:-world}
当变量未定义或者为空时,返回world内容,否则返回变量的值
[[email protected] ~]# result=${test:-UNSET}
[[email protected] ~]# echo $result
UNSET
[[email protected] ~]# echo $test
[[email protected] ~]#
结论:当test变量没有内容时,就返回了后面的UNSET。但是并没有给 result 赋值
(2)${value:=word}
[[email protected] ~]# unset result
[[email protected] ~]# echo $result
?
?
[[email protected] ~]# unset test
[[email protected] ~]# echo $test
?
[[email protected] ~]# result=${test:=UNSET}
[[email protected] ~]# echo $result
UNSET
[[email protected] ~]# echo $test
UNSET
?
提示:变量不存在时,会给变量赋值后面的内容
?
?
9.变量替换表
13. 常用文件测试操作
?
整数二元比较操作符
?
?
?
?
?
?
多分支结构
?
?
?
?
?
?
?
?
?
函数:
?