第11章:Shell编程

这里写图片描述这里写图片描述

一、正则表达式:
这里写图片描述

这里写图片描述
例子:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

二、字符截取命令

1、cut 选项 文件名       cut进行列提取
    -f 提取第几列
    -d 按照指定的分隔符分隔列

这里写图片描述

注意:上面的studebt.txt中的间隔不是“空格”,而是制表符“Tab”。
cut -f 2,4 studebt.txt
cut -d ":" -f 2,3 /etc/passwd
案例:假设我想删除当前Linux系统下的除了root外的所有可以登录的普通用户,(所有可以登录的普通用户/bin/bash):

(1)先提取出来所有普通用户的用户名
cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 12)再把提取出来的用户的用户名赋值给一个变量,用循环的方式一个一个删除。

注:cut命令只能识别制表符Tab,逗号,冒号等作为间隔符的列,不能识别空格作为间隔符的列,--->因此cut符具有局限性,从而引出awk。

2printf 格式化输出命令
printf "输出类型输出格式" 输出内容
    %ns   字符串
    %ni   整数
    %m.nf 浮点数

下面介绍几个案例:

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

3、awk  列截取
可以进行截取字符段、函数、判断、流程控制等强大的功能。

这里写图片描述
这里写图片描述
上图,注: $2表示第2列;\r回车 ; \t Tab ; \n换行

介绍awk中的几个常用命令:
(1)BEGIN:主要用于处理FS默认的分隔符
    cat /etc/passwd|grep "/bin/bash"|awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'2)FS内置变量:手工定义分隔符,默认情况下awk的分隔符是Tab、空格。
    cat student.txt|grep -v name|awk '$6>80 {printf $2 "\n"}'3)END
    awk 'END {printf "The End\n"} printf $2 "\t" $6 "\n"' student.txt
4、sed 流编辑器  (以行为单位)
作用:对文件中的数据进行选取、增删改。
sed 选项 '动作'
选项:
    -n 只打印查询出的内容
    -e 允许多个条件执行,多个条件之间用“分号”或“回车”
    -i 修改了文件本身内容,不加-i并没有修改文件的内容
动作:注意,动作必须用单引号括起来!
    a  追加
    i  行之前插入
    p  打印输出
    d  删除
    c  替换
    行号s/旧字符串/新字符串/g    替换字符串

这里写图片描述这里写图片描述这里写图片描述这里写图片描述

三、字符处理命令

1.排序命令sort
    sort 选项 文件名
选项:
    -f 忽略大小写
    -n 以数值排序,默认以字符串
    -r 反向排序
    -t 指定分隔符,默认以Tab为分隔符
2.wc 选项 文件名    统计命令
选项:
    -l 行数
    -w 单词数
    -m 字符数

条件判断

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

两种判断格式:
法1:test -e /root/install.log
法2:[ -e /root/install.log ]  注意:[]与中间的字符串必须有空格
注解:但是每次判断完文件是否存在,我们还需要用echo $?查看文件是否存在,比较麻烦--->因此我们可以用“逻辑运算符”把两句话联系起来,见下:
[ -e /root/install.log ]&&echo "yes" || echo "no"
再例:
    [-d /root ]&&echo "yes" || echo "no" 判断/root是否是一个目录;如果是目录,输出yes,否则输出no

四、流程控制语句
(一)控制语句-if语句

1、单分支if条件语句
    if [条件判断式] ; then       //需要;,和then写在一行
        程序
    fi
或者
    if [条件判断式]         //不需要;,不和then写在一行
        then
            程序
    fi
2、双分支if条件语句
    if [条件判断式]         //不需要;,不和then写在一行
        then
            条件成立时,执行的程序
        else
            条件不成立时,执行的另一个程序
    fi
3、多分支if条件语句
    if [ 条件判断式1 ]
        then
            当条件判断式1成立时,执行程序1
    elseif [条件判断式2]
        then
            当条件判断式2成立时,执行程序2
    ...省略更多条件...
    else
        当所有条件都不成立时,执行此程序
    fi
注意:
(1if语句使用fi结尾,和一般语言使用大括号结尾不同
(2)[条件判断式]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
(3then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了。

例子1:判断分区使用率
    #!bin/bash   //标注:这个是shell脚本
    rate=$(df -h|grep "/dev/sda5"|awk '{printf $5}'|cut -d "%d" -f1)   #统计根分区使用率,并把根分区使用率作为变量值赋给rate

    if [ $rate -ge 80 ]
        then
            echo "Warning! /dev/sda3 is full!"
    fi
例子2:备份/var/lib/mysql数据库到/tmp/dbbak目录下
    #!bin/bash
    ntpdate asia.pool.ntp.org &>/dev/null   #同步系统时间
    date=$(date +%y%m%d)  #把当前系统时间按照年月日格式赋值给变量date
    size=$(du -sh /var/lib/mysql)  #统计mysql数据库的大小,并把大小赋予size变量
    if [ -d /tmp/dbbak ]   如果/tmp/dbbak目录存在
        then
            echo "Date:$date">/tmp/dbbak/dbinfo.txt
            echo "Date size:$size">>//tmp/dbbak/dbinfo.txt
            cd /tmp/dbbak
            tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
            rm -rf /tmp/dbbak/dbinfo.txt
        else
            mkdir /tmp/dbbak
            echo "Date:$date">/tmp/dbbak/dbinfo.txt
            echo "Date size:$size">>//tmp/dbbak/dbinfo.txt
            cd /tmp/dbbak
            tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
            rm -rf /tmp/dbbak/dbinfo.txt
    fi
例子3:判断apache是否启动  【apache非常常用的脚本】
    #!/bin/bash
    port=$(nmap -sT 192.168.1.156|grep tcp|grep http|awk '{printf $2}')  #使用nmap命令扫描服务器,并截取apache服务的状态,赋值给port
    if { "$port" == "open" }
        then
            echo "$(date) http is ok!">>/tmp/autostart-acc.log
        else
            /etc/rc.d/init.d/httpd start &>/dev/null
            echo "$(date) restart http!">>/tmp/autostart-acc.log

(二)控制语句-case语句

case $变量名 in
    "值1")
        执行程序1
    "值2")
        执行程序2
    ......
    *)
        如果以上条件不成立,执行此程序
esac

(三)流程控制-for循环

语法一:
    for 变量 in123
        do 
            程序
        done1#!/bin/bash
    for time in morning noon afternoon ecening
        do
            echo "This is $time"
        done2:批量解压缩
    cd /lamp
    ls *.tar.gz>ls.log
    for i in $(cat ls.log)
        do
         tar -zxf$i&>/dec/null
        done
语法二:
    for ((初始值;循环控制条件;变量变化))
        do
            程序
        done
例:批量添加指定数量的用户
    #!/bin/bash
    read -p "请输入用户数量:" -t 30 num
    read -p "请输入用户名字:" -t 30 name
    read -p "请输入用户密码:" -t 30 pass 
    if[ ! -z "$name" -a ! -z "$name" -a ! -z "$pass"]
        then
        y=$(echo $num|sed 's/^[0-9]*$//g')  
            if [ -z "$y" ] 判断输入的num是否为数字
                then
                for((i=1;i<$num;i=i+1))
                    do
                        /usr/sbin/useradd $name$i&>/dev/null
                        echo $pass|/usr/bin/passwd -- stdin $name$i &>/dev/null
                    done
            fi
    fi

(四)while循环和until循环

1while [ 条件判断式 ]
    do
        程序
    done
2、
until 只要条件不成立,则一直循环;当条件成立时,循环终止。
until [ 条件判断式 ]
    do
        程序
    done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值