zoukankan      html  css  js  c++  java
  • Linux学习之二十一-shell编程基础

    Shell编程基础

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序

    Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了

    1. Linux中的shell种类(shell解释器的种类)

    [root@localhost ~]# cat /etc/shells

    /bin/sh

    /bin/bash

    /sbin/nologin

    /bin/dash

    /bin/tcsh

    /bin/csh

    1. shell脚本基本规则及执行

    在shell脚本文件中,第一行要指明使用哪种shell解释器

    #!/bin/bash            #指定shell解释器为bash

    从第二行开始的内容就是若干命令

    例:简单的shell脚本

    #!/bin/bash

    pwd

    mkdir -p test{1..10}

    touch test{1..10}/oldboy{1..10}

    ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'>>ip.txt

    echo "hello world!"

    parted /dev/sda p

    shell脚本的执行方式

    方法1、bash + 脚本名称

    方法2、sh + 脚本名称

    可以使用参数sh -x 进入到debug调试模式,查看执行过程

    方法3、./ + 脚本名称

    方法4、直接使用脚本的绝对路径即可

    1. shell脚本引用变量

    3.1 如果shell脚本全部是命令,灵活性会比较差,可以通过引用变量来实现,变量可以直接赋值也可以通过执行命令来赋值

    变量的命名规则:

    不能和系统已有的命令名字相同(多用大写字母),不能以数字开头

    只能以下划线,字母开头,变量中间允许有数字

    不能和系统当前已有的环境变量相同

    3.2 执行命令env查看当前的环境变量

    只查看系统所有环境变量名称env|awk -F "=" '{print $1}'

    调用环境变量echo %变量名%

    3.3 特殊环境变量$PS1可以自定义终端命令提示符

    echo $PS1

    PS1='[u@h W]$'

    PS1='[[e[31;1m] [e[0m] u@h W]#'

    [root@localhost ~]# echo $PS1

    [u@h W]$

    [root@localhost ~]# PS1='[[e[31;1m] [e[0m] u@h W]#'

    [20:56:21 root@localhost ~]#

    3.4 引用变量实例

    #!/bin/bash

    name=`hostname`

    echo "你当前的主机名是 $name"

    ip=`ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'

    echo "你当前的ip地址为$ip"

    ks_line=`cat /root/anaconda-ks.cfg|wc -l`

    echo "ks文件检测 共$ks_line行"

    rpm_count=`rpm -qa|wc -l`

    echo "rpm包检测 共$rpm_count个"

    ip_r=`route -n|awk '$1=="0.0.0.0" && $2=="10.0.0.254"'|wc -l`

    echo "网关检测 合格值为$ip_r"

    log_file=`wc -l /tmp/install.log|wc -l`

    echo "install日志检测 合格值为$log_file"

    se_status=`sestatus|awk '{print $NF}'`        #sestatus查看selinux状态

    echo "selinux状态检查 状态为$se_status"

    ssh_config=`cat /etc/ssh/sshd_config|wc -l`

    echo "ssh 优化检测 合格值为$ssh_config"

    1. shell脚本中的for循环

    例1:若需要批量创建10个用户,并生成随机密码并进行修改,且重定向到文件中显示用户名和密码

    #!/bin/bash

    for i in `seq -f stu%g 1 5`

    do

    useradd $i;PASS=`date +%N|md5sum|cut -c 1-8`;echo $i:$PASS >> passwd.txt;echo $PASS|passwd --stdin $i

    done

    例2:利用for循环,来优化开机启动项

    #!/bin/bash

    for i in `chkconfig|grep '^[a-Z]'|awk '{print $1}'|sed '$d'`; #先关闭所有开机启动项

    do

    echo $i

    chkconfig $i off

    done

     

    for j in network crond sysstat rsyslog sshd;    #再开启需要的启动项

    do

    chkconfig $j on

    done

    例3:利用for循环,将txt结尾的文件修改为TXT

    #!/bin/bash

    for i in `ls *.txt`

    do

    old_name=`echo $i|awk -F "." '{print $1}'`

    mv $i ${old_name}.TXT

    done

    例4:嵌套for循环

    批量创建10个以oldboy开头的目录,并在目录中创建10个大于300k的文件要求使用dd命令来创建文件

    #!/bin/bash

    mkdir oldboy{1..10}

    for n in oldboy{1..10}

    do

        for m in test{1..10}

        do

            dd if=/dev/zero of=${n}/$m bs=101k count=3

        done

    done

    5、shell脚本中的if判断语句

    有关判断的参数

    gt    大于

    eq    等于

    lt    小于

    ge    大于等于

    le    小于等于

    -o     逻辑或

    -z    判断输入的是否为空

    -n    判断输入的是否不为空

    例1:猜数字游戏

    #!/bin/bash

    num1=`echo $RANDOM*35/32767+1|bc`

    read -p "请输入一个数字:" num2

    echo $num1

    if [ $num1 -gt $num2 ];then

    echo "你猜的小了"

    elif [ $num1 -eq $num2 ];then

    echo "恭喜你,猜对了!"

    else

    echo "你猜的大了"

    fi

    例2:利用固定用法read -p '*** ' str来读取shell执行后用户输入的内容,判断是否为空

    #!/bin/bash

    read -p '请输入一个字符串:' str

    echo $str

    if [ -z $str ];then

        echo "你输入的内容不能为空!"

    fi

    1. shell脚本生产案例

    定时打包备份,保留最近一周的备份文件,过去的文件保留周六的

    mkdir -p /service/scripts

    cd /service/scripts/

    注意:此处要求备份七天以外每周六的内容,可以选择在周六刚刚过渡到周天的日期即周天凌晨,这样周六的内容备份才较为完整,备份内容为周六的,那么压缩包的名称需要用date命令的-d yesterday参数

    #!/bin/bash

    ####beifen

    W=`date +%w`

    if [ $W -eq 0 ];then

    tar zcvf /backup/6_etc_`date -d yesterday +%F`.tar.gz /etc

    else

    tar zcvf /backup/etc_`date -d yesterday +%F`.tar.gz /etc

    fi

    ####qingli

    find /backup -type f -name "*.tar.gz" -mtime +7|grep -v '6_etc_'|xargs rm –rf

    编写脚本进行测试,修改当前时间并备份,最后同步时间

    #!/bin/bash

    for n in `seq -w 24`

    do

    date -s "201804$n";/bin/bash /service/scripts/backup.sh

    done

    ntpdate ntp1.aliyun.com

    再把脚本写到定时任务中

    #on time backup

    1. 00 * * * /bin/bash /service/scripts/backup.sh &>/dev/null

     

    关于shell脚本的更多知识点,可以参考

    http://www.runoob.com/linux/linux-shell.html

     

    博主原创文章,转载请务必注明出处

  • 相关阅读:
    Java实现提取拼音首字母
    Java实现网格中移动字母
    Java实现网格中移动字母
    Java实现网格中移动字母
    SQL语句:Group By总结
    Maven学习 使用Nexus搭建Maven私服(转)
    CentOS7 搭建Git服务器(转)
    tomcat调优的几个方面(转)
    windows越用越卡怎么办?(转)
    Easyui datagrid行内【添加】、【编辑】、【上移】、【下移】
  • 原文地址:https://www.cnblogs.com/ssgeek/p/9220852.html
Copyright © 2011-2022 走看看