• shell脚本实例


    备注:一些与传递给shell的参数相关的变量:
    $# 命令行参数的个数
    $? 调用命令的返回值
    $$ 当前进程的进程号
    $! 最后一个后台命令的进程号
    $0 命令行的第一个参数,也就是命令名
    $n 命令行的第n个参数,如果要取超过9个参数${n}
    $* 所有的命令行参数,等于("$1 $2..."
    "$@" 所有的命令行参数,等于("$1" "$2"...)
    $_ 前一个命令的最后一个命令行参数

     

    1.     写一个脚本,利用循环计算10的阶乘

    #!/bin/bash

    #factorialteset

    factorial=1

    #for a in `seq 1 10`

    for a in 1 2 3 4 5 6 7 8 9 10

    do

    factorial=`expr $factorial * $a`

    done

      echo “10! = $factorial”

    上面的小程序能够实现求10!,但是有以下几点需要注意:

    1)     for循环的实现方式,以上两种都可以,一种是直接写for a in 1 2 34 5 6 7 8 9 10,并且这几个数字不需要加任何引号。另一种for a in `seq 1 10`,这里用反单引号引起来,反单引号表示执行里面的这句话,注意不能用单引号,更不能用双引号。

    2)     factorial=1在初始化的时候,这个等号左右不能有任何空格。一定要注意。

    3)     factorial=`expr $factorial * $a`,这句话要注意,也要用反单引号引起来。并且,乘号*前要用反斜杠进行转义。其中expr命令的用法是expr Expression,是求表达式变量的值。

    2、写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。

    #! /bin/bash

    #inputtest

    var=null

    while [ var != “end” ]

    do

    echo –n “inputa integer:”

    read var

    if [ $var = “END”]

    then

        break

    fi

    echo “var is$var”

    done

    以上程序,需要注意的是:

    1)if [ $var = “END”]这句话,必要的空格一定要有,另外,是=而不是==

    2)var=null这句话,仍然注意,变量赋值,等号左右不能有空格

    3)echo –n “inputa integer:”这句话中-n表示回车不换行, 这样写是为了好看,输入和提示在一行上,当然也可以不用-n这样的话提示在第一行,第二行上是输入的数。

    3、写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和。

    #!/bin/bash

    #sumtest

    sum=0

    fora in `seq 1 100`

    do

    if [ `expr $a % 3` -ne 0 ]

        continue

    fi

    sum=`expr $sum + $a`

    done

    echo“the sum is $sum”

    这个脚本在写的时候实在是调试了很多遍啊。

    1)一不小心就错了。特别是什么时候加空格,什么时候不加空格

    给变量赋值的时候一定不能有空格,比如sum=0,这个地方,另外,这里不要写成sum=null

    2)在进行两个数的运算的时候,不能直接写成sum=$sum+$a而要写成sum=`expr $sum + $a`

    3)也就是说,赋值语句的等号左右不能有空格。算数运算符左右一定要有空格,并且用expr再赋值给一个变量。

    4)整数比较的时候不能用=和!= 而要用 –eq  和-ne

     

     

    4、一个函数,利用shift计算所有参数乘积,假设参数均为整数( 特殊变量$# 表示包含参数的个数)

    #! /bin/bash

    #shifttest

    result=1

    while [ $# -gt 0 ]

    do

    result=`expr $1* $result`

    shift

    done

    echo “the result is $result”

    其中:$1代表的是第一个参数,$#代表的是参数的格式,$# -gt 0代表的是参数的个数大于0.

    shift表示移位

     

    5、写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。

    #!/bin/bash

    #casetest

    case${1##*.tar} in

    gz)

        tar jxvf $1

        ;;

    bz2)

        tar zxvf $1

        ;;

    *)

        echo “errorfile”

    esac

     

    备注:

    $1表示运行该脚本的第一个命令行参数

    ${1##*.tar}代表去掉第一个参数命令行参数的*.tar后剩下的部分。

    比如,运行脚本时用./mytar.shbak.tar.gz,那么$1就是指的bak.tar.gz,${1##*.tar.}就是gz

    同理,${3##*.tar.}表示第三个命令行参数去掉*.tar.后剩下的部分。

    6、写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。

     

     

    7、MySQL:Linux下自动备份数据库的shell脚本 Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库。其实非常简单,主要就是使用 MySQL 自带的 mysqldump 命令。


    脚本内容如下:
    #!/bin/sh
    # File: /home/mysql/backup.sh
    # Database info
    DB_NAME="test"
    DB_USER="username"
    DB_PASS="password"

    # Others vars
    BIN_DIR="/usr/local/mysql/bin"
    BCK_DIR="/home/mysql/backup"
    DATE=`date +%F`

    # TODO
    $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BCK_DIR/db_$DATE.gz

    然后使用将此脚本加到 /etc/crontab 定时任务中:

    01 5 * * 0 mysql /home/mysql/backup.sh

    好了,每周日凌晨 5:01 系统就会自动运行 backup.sh 文件备份 MySQL 数据库了。

  • 相关阅读:
    JSP 中文乱码显示处理解决方案
    jsp的9大对象
    获取各种路径
    输出自绘制图片
    Emmet基本使用方法
    <input type="file" />浏览时只显示指定文件类型
    使用dockerfile文件创建image
    gunicorn 访问日志配置与项目启动
    制作符合自己需求的镜像 docker image
    linux 查看系统信息
  • 原文地址:https://www.cnblogs.com/hllnj2008/p/3986778.html
Copyright © 2020-2023  润新知