一 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 0 ];then #-le 小于等于
- echo "usage: `basename $0` file"
- exit
- fi
- # 如果用户输入的参数不是文件
- if [ ! -f $1 ];hen
- ehco "error file!"
- exit
- fi
- for ip in `cat $1`
- do
- ping -c1 $ip &>/dev/null
- if [ $? -eq 0 ];then
- echo "$ip success"
- else
- echo "$ip failed"
- fi
- done
- 3
- read -p "Please input a number:" num
- while true
- do
- if [[ "$num" =~ ^[0-9]+$ ]];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 以调试方式执行, 查询整个执行过程
来源: https://www.cnblogs.com/damon-song/p/13170137.html