天天看点

编写简单shell脚本

#编写shell脚本

##1.编写简单脚本

    #!/bin/bash

    #for example by masf

    pwd

    ls -al

###内容简介:

    第一行 脚本声明(#!)告诉系统使用哪种shell解释器执行该脚本

    第二行 注释信息(#) 对脚本功能和某些命令的介绍

    第三行开始 写执行的命令

###执行方式:

    1.bash解释器运行脚本

    [[email protected] ~]# bash example1.sh

    2.通过输入完整路径运行脚本,需要修改权限

    [[email protected] ~]# chmod u+x example1.sh  增加可执行权限

    [[email protected] ~]# ./example1.sh 

##2.接收用户的参数

    1.Linux内设了用于接收参数的变量,变量之间使用空格间隔

    2.$0 对应的是当前脚本程序的名称

    3.$1、$2..... 分别对应第N个位置上的参数值

    4.$* 对应所有位置上的参数值

    5.$? 对应上一次命令的返回结果

    6.$# 参数的个数

###脚本样例

    #!/bin/bash

    echo "当前脚本名称为$0"

    echo "总共有$#个参数,分别是$*"

    echo "第一个参数是$1,第五个参数是$5."

### 执行结果                                                                                                                                                                              

    [[email protected] ~]# bash example2.sh one two three four five six 

    当前脚本名称为example2.sh

    总共有6个参数,分别是one two three four five six

    第一个参数是one,第五个参数是five.

##3. 判断用户的参数

###条件测试语句

    分类:

        文件测试语句

        逻辑测试语句

        整数值比较语句

        字符串比较语句

    格式:

        测试语句格式: [ 条件表达式 ]

        说明:条件表达式左右都有一个空格

###条件测试参数

    文件测试的参数及作用

    -d                     测试文件是否为目录

    -e                    测试文件是否存在

    -f                    测试文件是否是一般文件

    -r                    测试当前用户是否有权限读取

    -w                    测试当前用户是否有权限写入

    -x                    测试当前用户是否有权限执行

    逻辑测试语句

    &&(逻辑与)             && 符号前的命名为true,执行&&后命令

    ||(逻辑或)            || 符号前的命令为false,执行||后命令

    ! (逻辑非)

    整数比较运算符参数及作用

    -eq                    等于

    -ne                    不等于

    -gt                    大于

    -lt                    小于

    -le                    小于等于

    -ge                    大于等于

    字符串比较运算符参数及作用

    =                     比较字符串内容是否相同

    !=                    比较字符串内容是否不同

    -z                    判断字符串内容是否为空

###测试样例

    [roo[email protected] ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`

    [[email protected] ~]# echo $FreeMem

    941

    [[email protected] ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient memory"

    Insufficient memory

    [[email protected] ~]# echo $LANG

    zh_CN.UTF-8

    [roo[email protected] ~]# [ $LANG != "en.US" ] && echo "Not en.US"

    Not en.US

##4.流程控制语句

###if 条件测试语句

####测试样例:

    1.if条件语句判断/media/cdrom目录是否存在,存在就结束条件和整个脚本;不存在创建目录

    #!/bin/bash

    DIR="/media/cdrom"

    if [ ! -e $DIR ]

    then

    mkdir -p $DIR

    fi

    2.验证某台主机是否在线

    参数解释:

    -c                    设置尝试次数

    -i                    每个数据包的发送间隔

    -W                    设置超时时间

    #!/bin/bash

    ping -c 3 -i 0.2 -W 3 $1 $> /dev/null

    if [ $? -eq 0 ]

    then

    echo "Host $1 is on-line"

    else

    echo "Host $1 is off-line"

    fi

    3.多分支if语句来判断用户输入的分数在哪个成绩区间内

    参数解释

    read 用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量

    -p   用于向用户显示一定的提示信息

    #!/bin/bash

    read -p "Enter your score (0-100):" GRADE

    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then

    echo "$GRADE is excellent"

    elif [ $GRADE -ge 70 ] && [$GRADE -le 84] ; then

    echo "$GRADE is pass"

    else

    echo "$GRADE is Fail"

    fi

###for条件循环语句

####功能

    允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,适合处理的数据有范围

####语法结构

    for 变量名 in 取值列表

    do

        命令序列

    done

####测试样例

    参数解释

    id 用户名     命令查看用户的信息

    $?            判断命令是否执行成功,即用户是否已经存在

    /dev/null    是一个黑洞文件,把输出信息重定向到这个文件等同于删除数据

    1.从列表文件中读取多个用户名,然后逐一创建用户账户并设置密码

    #!/bin/bash

    read -p "Enter the users password:" PASSWD

    for UNAME in `cat users.txt`

    do

    id $UNAME $> /dev/null

    if [ $? -eq 0 ]

    then

    echo "already exists"

    else

    useradd $UNAME $> /dev/null

    echo "$PASSWD" | passwd --stdin $UNAME $> /dev/null

    if [ $? -eq 0 ]

    then

    echo "$UNAME , create success"

    else

    echo "$UNAME , create failure"

    fi

    fi

    done

###while条件循环语句

####语法结构

    while 条件测试操作

    do

        命令序列

    done

####测试样例

    参数解释

    $RANDOM 随机产生 0-32767之间的整数

    expr命令 取得结果

    #!/bin/bash

    PRICE=$(expr $RANDOM % 1000)

    TIMES=0

    echo "商品的实际价格为0-999之间,猜猜看是多少?"

    while true

    do

    read -p "请输入您猜的价格数据:" INT

    let TIMES++

    if [ $INT -eq $PRICE ] ; then

    echo "恭喜您答对了,实际价格是$PRICE"

    echo "您总共猜测了 $TIMES 次"

    exit 0

    elif [ $INT -gt $PRICE ] ; then

    echo "太高了!"

    else

    echo "太低了!"

    fi

    done

###case条件测试语句

####语法结构

    case 变量值 in

    模式1)

        命令序列1

        ;;

    模式2

        命令序列2

        ;;

    *)

        默认序列

    esac    

     #!/bin/bash

    read -p "请输入一个字符,并按Enter键确认:" KEY

    case "$KEY" in

    [a-z] |[A-Z])

    echo "您输入的是 字母"

    ;;

    [0-9])

    echo "您输入的是数字"

    ;;

    *)

    echo "您输入的是 空格、功能键或其他控制符"

    esac

##5.计划任务程序服务

###计划任务分类

    一次性计划任务:今晚11点30分开启网站服务

    长期性计划任务:每周一的凌晨3点25分把/home/xxxx 目录打包备份为 backup.tar.gz

###一次性计划任务

    设置任务            at 时间

    查看任务            at -l

    删除任务            atrm 任务序号

###周期性计划任务

    Linux系统使用crond服务

    crontab -e                创建、编辑计划任务

    crontab -l                查看计划任务

    crontab -r                删除某条计划任务

    crontab -u                编辑他人的计划任务(需要管理员登录)

    crontab设置任务参数及作用

    分                        取值为0-59的整数

    时                        取值为0-23的整数

    日                        取值为1-31的任意整数

    月                        取值为1-12的任意整数

    星期                        取值为0-7的整数(0/7均是周日)

    命令                        要执行的命令或脚本

###测试样例

    [[email protected] ~]# crontab -e

    no crontab for root - using an empty one

    crontab: installing new crontab

    [[email protected] ~]# crontab -l

    25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

    0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

###注意事项

    在参数配置中,可以以#开头写上注释信息

    计划任务中的分字段必须有数值,不能是空或*

    日与星期字段不能同时使用,否则会发生冲突

继续阅读