bash脚本编程知识储备
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?
第一种方法:
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# echo $[a+b]
3
第二种方法:let 命令的用法
格式:
let 赋值表达式
【注】let 赋值表达式功能等同于:((赋值表达式))
5.2 范例 1:给自变量 I 加5
[changsheng@localhost ~]$ i=2
[changsheng@localhost ~]$ let i=i+5
[changsheng@localhost ~]$ echo $i
7
==>去掉 let 定义
[changsheng@localhost ~]$ i=i+5
[changsheng@localhost ~]$ echo $i
i+5
提示: let i=i+5 等同于 ((i=1+5)),但后者效率更高
5.3 范例2 :利用let计数监控web服务状态的小项目(如果看不懂,可以跳过去,这个只是提升题)
#########################################################################
# File Name: _server_monitor.sh
# Author: changsheng
# mail: 1210982521@qq.com
# 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之间的数字:
[root@localhost test-scripts]# seq -s " " 10
1 2 3 4 5 6 7 8 9 10
注解: -s 是指定分隔符
7. shell 的特殊变量
如下图所示:


7.1 $* 和$@区别例子:
$* 将所有的命令行的所有参数视为单个字符串,等同于"$1$2$3
$@ 将命令行的每个参数视为单独的子串,等同于"$1" "$2" " $3".这是将参数传递给其它程序的最佳方式,因为他会保留所有内嵌在每个参数的任何空白。
实战演示:
[root@localhost test-scripts]# set -- "I am" handsome boy #===》传入三个参数
[root@localhost test-scripts]# echo $# #==è现在有三个参数
3
[root@localhost test-scripts]# for i in $*;do echo $i;done #循环打印这些参数用$*,无引号
I
am
handsome
boy
[root@localhost test-scripts]# for i in $@;do echo $i;done #没有引号的情况下和$*结果一样
I
am
handsome
boy
[root@localhost test-scripts]# for i ;do echo $i;done #--无in变量列表,相当于 in "$@"
I am
handsome
boy
[root@localhost test-scripts]# for i in "$@";do echo $i;done #------在有双引号的情况下,参数里引号内内容当做是一个参数输出了,这才是符合我们传入参数的要求set – "I am" handsome boy .
I am
handsome
boy
[root@localhost test-scripts]# for i in "$*";do echo $i;done #--加了双引号,$*表示一个字符串
I am handsome boy
[root@localhost test-scripts]# shift #---用shift 去掉第一个参数
[root@localhost test-scripts]# echo $#
2
[root@localhost test-scripts]# for i in "$@";do echo $i;done #--再次打印只剩后面的参数
handsome
boy
8.变量子串的常用操作


我来为朋友们举例说明:
定义changsheng变量,内容为"I am chang sheng "
[root@localhost etc]# changsheng="I am chang sheng"
[root@localhost etc]# echo ${changsheng}
I am chang sheng
- 返回字符串changsheng变量字符串的长度
[root@localhost ~]# echo ${#changsheng}
16
2)截取changsheng变量字符串从第二个字符之后开始取,默认取后面字符的全部,第2个字符不包括在内。 也可以理解为删除前面的多少字符
[root@localhost ~]# echo ${changsheng:2}
Am chang sheng
3)截取changsheng变量字符从第二个字符之后,取两个字符。
[root@localhost ~]# echo ${changsheng:2:2}
am
提示:类似 cut –c 参数
[root@localhost ~]# echo ${changsheng}|cut -c 1-4
I am
[root@localhost ~]# echo ${changsheng}|cut -c 3-4
am
4)从变量$changsheng开头开始删除最短匹配"I am " 子串
[root@localhost ~]# echo ${changsheng#I am}
Chang sheng
5)从变量$changsheng开头开始删除最长匹配"I am chang子串"
[root@localhost ~]# 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内容,否则返回变量的值
[root@localhost ~]# result=${test:-UNSET}
[root@localhost ~]# echo $result
UNSET
[root@localhost ~]# echo $test
[root@localhost ~]#
结论:当test变量没有内容时,就返回了后面的UNSET。但是并没有给 result 赋值
(2)${value:=word}
[root@localhost ~]# unset result
[root@localhost ~]# echo $result
[root@localhost ~]# unset test
[root@localhost ~]# echo $test
[root@localhost ~]# result=${test:=UNSET}
[root@localhost ~]# echo $result
UNSET
[root@localhost ~]# echo $test
UNSET
提示:变量不存在时,会给变量赋值后面的内容
9.变量替换表

13. 常用文件测试操作


整数二元比较操作符





多分支结构







函数:


bash脚本编程知识储备的更多相关文章
- 脚本命令高级Bash脚本编程指南(31):数学计算命令
题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese
<Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...
- 高级bash脚本编程(三)
高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...
- 高级Bash脚本编程(二)
高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...
- 高级Bash脚本编程(一)
高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...
- Bash脚本编程总结
bash脚本编程之用户交互: read [option]… [name …] -p ‘PROMPT’ -t TIMEOUT bash -n /path/to/some_script 检测脚本中的 ...
- Bash脚本编程之算术运算
简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...
- Bash脚本编程之字符串处理
简介 其实这里说得字符串处理,对应的是bash官网中的[Shell Parameter Expansion],不过直接去看这部分内容实在是太难以理解了.就按照马哥所说的字符串处理会比较好理解,平常使用 ...
随机推荐
- TCP三次握手及关闭时的2MSL分析
TCP/IP三次握手四次挥手,是非常重要的,这个链接与关闭过程也是非常easy的.但为什么是三次握手?以及为什么要等待2MSL的状态?大部分人或许听到这个问题就蒙了.这篇博客就综合<TCP/IP ...
- h5-8 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 0x59 单调队列优化DP
倍增DP太难啦心情好再回去做 poj1821 先让工匠按s排序,f[i][j]表示枚举到第i个工匠涂了j个木板(注意第j个木板不一定要涂) 那么f[i][j]可以直接继承f[i-1][j]和f[i][ ...
- hdoj-1004-Let the Balloon Rise(水题)
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Linux查找并杀死僵尸进程
1.查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程. 2.定位僵尸进程 使用命令ps -A -ostat,ppid,pid,cmd |gre ...
- ASCII编码
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英 ...
- NOIP2012D2T1 同余方程
[NOIP2012T4]同余方程 noip2012-tg 描述 求关于 x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 输入格式 输入文件 mod.in 输入只有一行,包含两个正整数a,b ...
- Three.js入门——画星空(star field)
Three.js是一个很流行的3D JavaScript库.这里有一个three.js的入门教程,在浏览器窗口中画出星空.我按照教程重新实现了一遍,这里的这篇博客把教程大致翻译了一遍.我的demo. ...
- Spring学习笔记之基础、IOC、DI(1)
0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...
- android黑科技系列——破解游戏之修改金币数
我们在玩游戏的时候总是会遇到一些东东需要进行购买的,但是我们可能又舍不得花钱,那么我们该怎么办呢?那就是用游戏外挂吧!我们这里说的是Android中的游戏,在网上搜索一下移动端游戏外挂,可能会找到一款 ...