Shell 脚本学习(1)
一 Shell概览
1. 自动化批量系统初始化程序(update, 软件安装,时区设置,安全策略,...)
2. 自动化批量软件部署程序(LAMP,LNMP,Tomcat,LVS,Nginx)
3. 应用管理程序(KVM,集群管理扩容,MySQL)
4. 日志分析处理程序(PV,UV,200,!200,top 100, grep/awk)
5. 自动化备份恢复程序(MySQL完全备份/增量+Crond)
6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix信息采集
9. 自动化扩容(增加云主机——>部署应用,业务上线)
10. Shell可以做任何事
二 小程序
1
#!/bin/bash
ping -c1 www.baidu.com $>/dev/null && echo "success" || echo "failed"
"#!":linux系统官方称呼为Shebang,用来给当前脚本定义默认解释器的。
"$>" : 将结果重定向。(标准输出1,错误输出2)
"&&":前面的命令的返回值为0(即成功),则执行其后命令。
"||":前面的命令返回值为1(即失败),则执行其后命令
2
#!/usr/bin/bash
#如果用户没加参数
if [ $# -eq ];then #-le 小于等于
echo "usage: `basename $0` file"
exit
fi
#如果用户输入的参数不是文件
if [ ! -f $ ];hen
ehco "error file!"
exit
fi for ip in `cat $`
do
ping -c1 $ip &>/dev/null
if [ $? -eq ];then
echo "$ip success"
else
echo "$ip failed"
fi
done
3
read -p "Please input a number: " num while true
do
if [[ "$num" =~ ^[-]+$ ]];then #判断输入的是否是数字
break;
else
read -p "Please input a number: " num
fi
done
三 命令
"&": 后台运行;
但后台运行后,关掉终端后程序会关掉。
"nohup"允许后台运行的程序,在关掉终端后还可以运行。
"bg"查看后台进程;"fg"查看前台进程
连贯动作:"ctrl+z"后台执行,"bg"返回前台
kill 3 杀死PID为3的进程;kill %3 给当前终端进程号为3的作业发信号
true永远返回真,false命令永远返回假,$?查看上一条命令返回值
";"只是将一行上的两个命令分开。
basename 生成路径中的文件名
dirname 生成路径中的文件夹名
bash -vs shell脚本:调试执行脚本
seq 数字:输出从1到数字的所有数字
" ":双引号是弱引用,里面变量会被替换
‘ ’:单引号是强引用,里面变量不会被替换,就是字符串
` `反引号 命令替换 等价于$() 反引号中的命令会先被执行
():子shell中之心
(()):数值比较运算
{}:集合
${}:变量引用
[]:条件测试
[[]]:条件测试,支持正则 [[ =~ ]]
$[]:整数运算
四 Shell通配符
* 匹配任意多个字符
?匹配任意一个字符
[] 匹配方括号中任意一个字符 [^] 匹配任意非括号中字符
() 在子shell中执行命令
{} 集合 mkdir {1.txt,2txt} 创建1.txt和2.txt文件
\ 转义符
小知识:
echo -e "\e[1;31mhello" 显示的hello为红色(31m),前景色的数字30-37,后景色的数字40-47
printf "hello %b" damon 格式化输出 hello damon
五 变量
shell中变量都是字符串
1.自定义变量(C语言中的局部变量)
定义变量: 变量名=变量值 变量名命名规范和c语言一致;
read 变量名 :表示从键盘读入;
read -p "Please input a name: " `name :加提示从键盘读入
引用变量: %变量名 或 ${变量名}; ${#变量名}:变量名长度
查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset变量名
作用范围:仅在当前shell中有效
2.环境变量(C语言中的全局变量)
定义环境变量:方法一 export v1 = /home/backup
方法二 export v2 将自定义变量转换成环境变量
引用环境变量:$变量名 或${变量名}
查看环境变量:echo $变量名 或者 env 例如 env |grep v1
取消环境变量:unset变量名
变量作用范围:在当前shell和子shell有效
一般我们自己不定义
3.位置变量
$1 $2 $3 $4....
4.预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 所有参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值(0便是成功)
六 变量的运算
1.整数运算
方法一:expr 1 + 2 + - \* / %
方法二:$((1 + 2)) + - * / %
方法三:$[1+2] + - * / %
方法四:let; let num = 1 + 2; echo $sum
2.小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "printf 5.0/2" |python
3.变量内容的删除和替换
url=www.baidu,com.cn
echo ${#url} #显示 变量长度
echo ${url#*.} #显示 变量从前往后删除到第一个点的后的字符串
echo ${url##*.} #显示 变量从前往后删除到最后一个点后的字符串
echo ${url%.*} #显示 变量从后往前删除到第一个点后的字符串
echo ${url%%.*} #显示 变量从后往前删除到最后一个点后的字符串 #变量切片
echo ${url:0:5} #显示 从第0位数5为的字符串
echo ${url:3} #显示 从第3位到最后的字符串 #变量内容替换
echo ${url/sina/baidu} #显示 将sina替换成baidu的字符串
echo ${url//n/N} #显示 将所有m替换成N的字符串 #变量的替代
${变量名-新的变量值}
变量没有被定义:会使用“新的变量值”替代
变量有被定义:不会被替代 ${变量名:-新的变量值}
变量没有被定义或者被定义但是空值:会使用“新的变量值”替代
变量有被定义且不为空值:不会被替代
${变量名+新的变量值}
变量没有被定义:不会被替代
变量有被定义:会被新值替代
${变量名:+新的变量值}
变量没有被定义或值为空:不会被替代
变量有被定义且值不为空:会被新值替代
${变量名=新的变量值}
变量被定义且值为空:不会被替代
变量没有被定义或值不为空:会被新值替代
${变量名:=新的变量值}
变量没有被定义或值为空:会被替代
变量有被定义且值不为空:不会被新值替代
七 执行脚本
./test.sh 需要执行权限 在子shell中执行
bash test.sh 不需要执行权限 在子shell中执行
. test.sh 不需要执行权限 在当前shell中执行
source test.sh 不需要执行权限 在当前shell中执行
提示:通常修改系统配置文件如/etc/profile 的 PATH等变量后,使之在当前shell中执行
sh -n test.sh 仅调试syntax error
sh -vx test.sh 以调试方式执行,查询整个执行过程
Shell 脚本学习(1)的更多相关文章
- 笔记——shell脚本学习指南
<shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...
- Shell 脚本学习资料搜集
Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- 转 shell脚本学习指南
shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...
- Shell脚本学习 - 运算符
继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...
- shell脚本学习总结02--数组
bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ...
- Shell脚本学习指南笔记
Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...
- shell脚本学习之6小时搞定(1)
shell脚本学习之6小时搞定(1) 简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把 ...
- shell脚本学习心得
近来主要捣鼓ubuntu,大多数项目中都用到了sh脚本作为启动脚本等,以前只是大概明白如何使用,今天需要自己修改并运行脚本就碰到了很多问题,所以决定静下心来学习一下shell脚本,学习了几个小时,现将 ...
- shell脚本学习(一)
Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型.特定的工作. Shell的特点有: 1. 简单性 2. 可移植性 3. 开发容易 [什么是shell] 简单点理解,就是系统跟计算 ...
随机推荐
- AVIRIS反射率数据简介
Surface Reflectance 高光谱图像 ↑ AVIRIS高光谱成像光谱仪采集得到的原始图像为辐亮度图像,经过校正后的L1级产品为地表辐亮度信息.但是许多时候,我们更希望知道地面目标物的反射 ...
- (Java实现)洛谷 P1164 小A点菜
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
- Java实现 蓝桥杯 基础练习 杨辉三角形
基础练习 杨辉三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质 ...
- Java实现 LeetCode 413 等差数列划分
413. 等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, - ...
- Java实现 LeetCode 94 二叉树的中序遍历
94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...
- Java实现三人年龄
2 三人年龄 三个神秘蒙面人来访F博士. 博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁.我们3人年龄总和为70岁.且我们三人年龄的乘积是所有可能情况中最大的. 请帮助F博士计算他们的年龄, ...
- Java实现第九届蓝桥杯第几个幸运数字
第几个幸运数字 题目描述 到x星球旅行的游客都被发给一个整数,作为游客编号. x星的国王有个怪癖,他只喜欢数字3,5和7. 国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来 ...
- java实现第九届蓝桥杯三角形面积
三角形面积 小明最近在玩一款游戏.对游戏中的防御力很感兴趣. 我们认为直接影响防御的参数为"防御性能",记作d,而面板上有两个防御值A和B,与d成对数关系,A=2^d,B=3^d( ...
- Java与Swift对比
本文链接:http://blog.csdn.net/msyqmsyq/article/details/53538159 从Java到Swift还是比较简单的,相比Object-C,Swift和Java ...
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (2) - Stream的中间操作
Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...