Shell 能做什么?
- 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
- 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
- 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
- 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
- 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 自动化扩容(增加云主机——>业务上线)
zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线) - 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
- Shell可以做任何事(一切取决于业务需求)
变量的类型:
1.自定义变量
变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset 变量名
作用范围:仅在当前shell中有效
例
#!/usr/bin/bash
ip=192.168.254.133
ping -c1 $ip &>/dev/null && echo "$ip is up " || echo "$ip is down"
2.环境变量
定义环境变量:方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
查看环境变量:echo $变量名 env 例如env |grep back_dir2
取消环境变量:unset 变量名
变量作用范围:在当前shell和子shell有效
3. 位置变量
4. 预定义变量
#!/bin/bash
ip=192.168.254.133
ping -c2 $ip &>/dev/null #讲ping的过程放入/dev/null
if [ $? = 0 ];then #若返回值为真(能ping通)
echo "host $ip is ok"
else
echo "host $ip is fail"
fi
变量的赋值方式
1. 显式赋值
变量名=变量值
ip1=192.168.1.251
school="BeiJing 1000phone"
today1=`date +%F`
today2=$(date +%F)
echo $today2
以上四种方式都是给字符串赋值
2. read 从键盘读入变量值
read 变量名
#!/usr/bin/bash
read -p "输入姓名: " name
read -p "输入性别: " sex
read -p "输入年龄: " age
#!/usr/bin/bash
read -p "please input your ip: " ip
if ping -c1 $ip &>/dev/null;then
echo "$ip is up"
else
echo "$ip is down"
fi
Shell 条件测试
格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]]
文件测试 [ 操作符 文件或目录 ]
[ -f file ] 是否存在,而且是文件 [ -f anaconda-ks.cfg ]; echo $?
[ -r file ] 当前用户对该文件是否有读权限
[ -x file ]
[ -w file ]
[ -L file ] 链接的意思
#!/usr/bin/bash
if [ $UID -eq 0 ]
then
yum -y install lftp
echo "安装完成"
else
echo "没有权限"
fi
#!/usr/bin/bash
ip=192.168.254.133
if ping -c1 $ip &>/dev/null;then
echo "$ip is up"
else
echo "$ip is down"
fi
数值比较 [ 整数1 操作符 整数2 ]
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于
#!/bin/bash
read -p "pls input score to test level:" score
if [ $score -ge 90 ]; then
echo "优秀"
elif [ $score -ge 80 ]; then
echo "良好"
elif [ $score -ge 70 ]; then
echo "中等"
elif [ $score -ge 60 ]; then
echo "及格"
else
echo "不及格"
fi
#!/usr/bin/bash
if [ -f /var/mysql_test ]
then
echo "文件存在,显示文件信息"
sleep 1
ls -l /var/mysql_test
else
echo "文件不存在,开始创建文件"
sleep 1
touch /var/mysql_test
echo "创建成功"
fi
流程控制:if
单分支结构
if 条件测试
then 命令序列
fi
双分支结构
if 条件测试
then 命令序列
else 命令序列
fi
多分支结构
if 条件测试1
then 命令序列
[elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列]...
else 命令序列
fi
#!/usr/bin/bash
read -p "确认开始安装KVM [y]: " kvm_install
if [ ! "${kvm_install}" = "y" ];then
echo -e "$red_col输入不正确! $reset_col"
exit
fi
#!/usr/bin/bash
read -p "Please input a username: " user
id $user &> /dev/null
if [ $? -ne 0 ]; then
echo "no such user: $user"
fi
read -p "Are you sure ? [y/n] : " action
if [ "$action" = "y" ];then
userdel -r $user
else
echo " good! "
fi
case 语法结构
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac
#!/usr/bin/bash
web1 =192.168.254.143
web2 =192.168.254.133
cat << EOF
1.web1
2.web2
EOF
read -p “input your number: ” num
case “$nmu” in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
esac
#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice" choice
case $choice in
m|M)
free -m
;;
d|D)
df -h
;;
q|Q)
exit
;;
*)
eco "Invalid input"
;;
esac
for 语法结构
for 变量名 [ in 取值列表 ]
do
循环体
done
#!/bin/bash
for (( i = 1; i <=9; i++ ))
do
for (( j=1; j <= i; j++ ))
do
let "temp = i * j"
echo -n "$i*$j=$temp "
done
echo "" #output newline
done
Shell循环:while until
while语句结构
while 条件测试
do
循环体
done
当条件测试成立(条件测试为真),执行循环体
until语法结构
until 条件测试
do
循环体
done
当条件测试成立(条件测试为假),执行循环体
#!/bin/bash
for ((i=1; i <= 9; i++))
do
j=9;
while ((j > i))
do
echo -n " "
let "j--"
done
k=1
while ((k <= i))
do
echo -n "*"
let "k++"
done
echo ""
done
查看内存使用率
#!/usr/bin/bash
mem_used=`free -m | grep Mem | awk '{print $3}'`
mem_total=`free -m | grep Mem | awk '{print $2}'`
mem_percent=$(( mem_used*100/mem_total ))
echo "当前内存使用率:$mem_percent"
批量修改root密码
#!/usr/bin/bash
read -p "please enter a new password: " pass
for ip in $(cat ip.txt)
do
{
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
ssh $ip "echo $pass | passwd --stdin root"
if [ $? -eq 0 ];then
echo "$ip" > ok.txt
else
echo "$ip" > no.txt
fi
else
echo "finish"
fi
}
done
定义数组
#!/usr/bin/bash
while read line
do
hosts[++i]=$line
done </etc/hosts
for i in ${!hosts[*]}
do
echo "$i:${hosts[$i]}"
done
~
统计性别
#!/usr/bin/bash
declare -A sex
while read line
do
type=`echo $line | awk '{print $2}'`
let sex[$type]++
done < sex.txt
for i in ${!sex[*]}
do
echo "$i:${sex[$i]}"
done
阶乘
#!/usr/bin/bash
read -p "please input a mum:" shuzi
fun(){
factorial=1
for ((i=1;i<=$shuzi ;i++))
do
factorial=$[$factorial*$i]
done
echo "$shuzi 的阶乘是:$factorial"
}
fun
函数结果,赋予数组
#!/usr/bin/bash
num=(1 2 3)
array(){
local j
for i in $*
do
outarray[j++]=$[$i+5]
done
echo "${outarray[*]}"
}
result=`array ${num[*]}`
echo ${result[*]}
~
网友评论