linux shell

Shell 能做什么?

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机——>业务上线)
    zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  11. 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 

统计性别

#!/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[*]}

~                     

你可能感兴趣的:(linux shell)