一个带参数的Shell的例子

#!/bin/bash
# Program:
#   LZSH server log filter
# History:
#   2014/07/01  Kom     First release
#   2014/07/03  Kom     Remote and multi-param support

# Set PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Set script name variable
SCRIPT=`basename ${BASH_SOURCE[0]}`

# Initialize variables to default values
IP=
USER=
TMPOUTPUT=
declare -a KEYS
declare -a INPUTS
OUTPUT=

# Set fonts for help
NORM=`tput sgr0`
BOLD=`tput bold`
REV=`tput smso`

# Help function
function HELP
{
    echo -e \\n"${BOLD}龙之守护数据过滤脚本${SCRIPT}${NORM}的帮助文档"\\n
    echo -e "${REV}用法:${NORM} ${BOLD}$SCRIPT 参数${NORM}"\\n
    echo "可选参数:"
    echo "${REV}-a${NORM}  --输入文件所在的IP,为空表示本地(默认为空)"
    echo "${REV}-u${NORM}  --访问输入文件所用的用户名,当文件在本地时不使用此参数"
    echo "${REV}-k${NORM}  --用于过滤的关键字,此参数可以多个联合使用(例如:-k物品创建 -k强化石)"
    echo "${REV}-i${NORM}  --输入文件的全路径,此参数可以多个联合使用(例如:-i/home/log/objscenesserver21.log.140701-* -i/home/log/objscenesserver40.log.140701-*)"
    echo "${REV}-o${NORM}  --本地输出文件的全路径(例如:-o/local/lzsh.log)"
    echo "${REV}-t${NORM}  --临时输出文件的全路径,当文件在本地时不使用此参数"
    echo -e "${REV}-h${NORM}  --显示此帮助并退出"\\n
    echo -e "示例: "
    echo -e "${BOLD}$SCRIPT -a127.0.0.1 -uUsername -k物品创建 -k强化石 -i/home/log/objscenesserver21.log.140701-* -o/local/lzsh.log -t/tmp/lzsh.log${NORM}"\\n
    exit 1
}

# Check the number of argument. If none are passed, print help and exit.
if [ $# -eq 0 ]; then
    HELP
fi

while getopts :a:u:t:i:o:k:h FLAG; do
    case $FLAG in
        a)
            IP=$OPTARG
            ;;
        u)
            USER=$OPTARG
            ;;
        t)
            TMPOUTPUT=$OPTARG
            ;;
        i)
            INPUTS[${#INPUTS}]=$OPTARG
            ;;
        o)
            OUTPUT=$OPTARG
            ;;
        k)
            KEYS=(${KEYS[@]} $OPTARG)
            ;;
        h) # show help
            HELP
            ;;
        \?) # unrecognized option - show help
            echo -e \\n"非法参数:-${BOLD}$OPTARG${NORM}"
            HELP
            ;;
    esac
done

shift $((OPTIND-1)) #  This tells getopts to move on to the next argument

#######################################################################
# Parameters check

if [ ${#KEYS} -eq 0 ]; then
    echo "你必须指定至少一个${BOLD}关键字${NORM}"
    exit -1
else
    echo "关键字:${BOLD}${KEYS[@]}${NORM}"
fi

if [ ${#INPUTS} -eq 0 ]; then
    echo "你必须指定至少一个${BOLD}输入文件${NORM}"
    exit -1
else
    echo "输入文件:${BOLD}${INPUTS[@]}${NORM}"
fi

if [ -z $OUTPUT ]; then
    echo "你必须指定${BOLD}本地输出文件${NORM}"
    exit -1
fi
    echo "输出文件:${BOLD}${OUTPUT[@]}${NORM}"

if [ ! -z $IP ]; then
    if [ -z $USER ]; then
        echo "必须指定用于访问${BOLD}${IP}${NORM}的${BOLD}用户名${NORM}"
        exit -1
    fi
    if [ -z $TMPOUTPUT ]; then
        echo "必须指定在${BOLD}${IP}${NORM}上的${BOLD}临时输出文件${NORM}"
        exit -1
    fi
fi

#######################################################################
# Work

CMDK=""
for k in ${KEYS[@]}
do
    CMDK=${CMDK}"| grep $k "
done

CMDI=""
if [ ! -z $IP ]; then
    CMDK=$CMDK">> $TMPOUTPUT"
    CMDI="echo > $TMPOUTPUT"
else
    CMDK=$CMDK">> $OUTPUT"
    CMDI="echo > $OUTPUT"
fi

for i in ${INPUTS[@]}
do
    CMDI=${CMDI}" && cat $i $CMDK"
done

if [ ! -z $IP ]; then
    echo -e \\n"将要执行ssh命令:"
    echo "${BOLD}ssh [email protected]$IP \"$CMDI\"${NORM}"
    sh -c "ssh [email protected]$IP \"$CMDI\""

    echo -e \\n"将要执行scp命令:"
    echo "${BOLD}scp [email protected]$IP:$TMPOUTPUT $OUTPUT${NORM}"
    sh -c "scp [email protected]$IP:$TMPOUTPUT $OUTPUT"
else
    echo -e \\n"将要执行命令:"
    echo "${BOLD}$CMDI${NORM}"
    sh -c "$CMDI"
fi

exit 0

参考:http://tuxtweaks.com/2014/05/bash-getopts/

一个带参数的Shell的例子,布布扣,bubuko.com

时间: 2024-08-10 17:17:24

一个带参数的Shell的例子的相关文章

CAD执行一个带参数的命令(com接口VB语言)

主要用到函数说明: MxDrawXCustomFunction::Mx_SendStringToExecute 执行一个带参数的命令.详细说明如下: 参数 说明 CString sCmaName 命令名 Param 命令参数 VB中实现代码说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Dim param As MxDrawResbuf Set param = New MxDrawRes

python django TDD实现一个带简单注册的记事本例子

1.新建 django应用   NotPad 2.新建项目 note 3.新建功能测试 mkdir function_test touch function_test/ __init__.py 在 /function_test下新建tests.py 功能测试   /function_test/tests.py代码 from selenium import webdriver from selenium.webdriver.common.keys import Keys import time f

关于datagrid查询时,封装了pojo对象,该对象必须要有一个带参数的构造器,否则会报错Unable to locate appropriate constructor on class

---------------------------------------------------------- 实体类中 public CategoryBeanPojo(Integer id, String type, Boolean hot, String login,            String name, String pass, Integer aid) {        super();        this.id = id;        this.type = ty

MySQL带参数的存储过程小例子

http://wwty.iteye.com/blog/698239 mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name |

微信二维码带参数的二维码(转)

官方文档地址:https://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html 原文地址:http://jingyan.baidu.com/article/fdbd4277cfd0c6b89f3f485f.html 注意事项 我知道你们是没有心情看注意事项的,但是很重要,所以我先摆上来. 用户扫描带参数的二维码,可能推送以下两种事件: 1.如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给

JavaScript学习笔记 -- 带参数arguments的函数的用法

JavaScript函数有带参数与不带参数两种形式,不带参数情况如下: function myFunction() { alert('HelloWorld!') } 在这种类型的函数中,输出值是确定的,即明确清楚或可以直接看出输出结果.那么带参数的函数的情况呢,什么时候需要用到参数,为什么要用,好处在哪里?首先我们来看一个简单设置边框颜色的函数,如下: <!DOCTYPE html> <html lang="en"> <head> <meta

带参数的URLconf

我们在Django建立helloworld自定义页面创建的页面,只能算是一个静态页,发起一个请求,返回一个固定的值,并不能满足我们动态的需求.今天我们创建一个带参数的URLconf,根据参数展示不同的内容. 另一个试图函数 打开views.py,创建一个试图函数 1 def current_dt(request): 2 now = datetime.datetime.now() 3 html = "<html><body>it is now %s.</body>

C语言中带参数的宏

带参数的宏定义有如下的格式: [#define 指令----带参数的宏] #define 标识符(x1,x2,……,xn) 其中  x1,x2,……xn是标志符(宏的参数) 注意:在宏的名字和括号之间必修没有空格. 如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分 当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用.在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器

android使用HttpURLConnection实现带参数文件上传

文件上传是常见功能,然而android网上大多数的文件上传都使用httpclient,而且需要添加一个httpmine-jar,其实HttpURLConnection也可以实现文件上传,但是它在移动端有个弊端,就是不能上传大文件,所以这次说的方式,只能上传一些较小的文件. 文件上传,并且带上一些参数,这需要我们了解http请求的构造方式,也就是它的格式. HttpURLConnection需要我们自己构造请求头部,也就是我们要拼接出一个正确完整的请求. 下面来看一个典型的例子 POST /api