shell脚本处理长参数的模板
shell脚本处理长参数的模板
一个shell模板,处理命令行参数,支持长短参数:
#!/bin/bash
#
# FILE: kvm-clone-v2.sh
#
# DESCRIPTION: Clone a RHEL5.4/RHEL6 kvm guest on ubuntu14.04 host superv.
# This shell is used for cloning RHEL5.4 or RHEL6.x KVM guest.
# Note this shell is only tested for host OS Ubuntu14.04 and RHEL6.4.
#
# KVM is short for Kernel-based Virtual Machine and makes use of
# hardware virtualization. You need a CPU that supports hardware
# virtualization, e.g. Intel VT or AMD-V.
#
# NOTES: This requires GNU getopt.
# I do not issue any guarantee that this will work for you!
#
# COPYRIGHT: (c) 2015-2016 by the ZhangLiang
#
# LICENSE: Apache 2.0
#
# ORGANIZATION: PepStack (pepstack.com)
#
# CREATED: 2015-05-22 12:34:00
#
#=======================================================================
_file=$(readlink -f $0)
_dir=$(dirname $_file)
. $_dir/common.sh
# Treat unset variables as an error
set -o nounset
__ScriptVersion="2015.05.22"
__ScriptName="kvm-clone-v2.sh"
#-----------------------------------------------------------------------
# FUNCTION: usage
# DESCRIPTION: Display usage information.
#-----------------------------------------------------------------------
usage() {
cat << EOT
Usage : ${__ScriptName} CFGFILE [OPTION] ...
Create a virtual machine from given options.
Options:
-h, --help Display this message
-V, --version Display script version
-v, --verbose
-o, --origver=ORIGVER Origin vm name with version: rhel5_4 | rhel6_4
-D, --disksize=DISKSIZE Origin vm disk size: compact|medium|large
-p, --path-prefix=PATH Path prefix of vm
-m, --memsize=SIZEMB Memory size of vm by MB: 8192
-c, --vcpus=VCPUS Number of virtual cpu cores: 4
-n, --vmname=VMNAME Given name of vm
-H, --domain<DOMAIN> Optional hostname suffix of vm
-i, --ipv4=IPADDR Static ipv4 addr of vm if used
-S, --supervisor=SUPERVISOR Supervisor of vm: rhel6.4 or ubuntu14.04
-G, --gateway=GATEWAY Gateway ipv4 address
-T, --iftype=IFTYPE Network type: bridge or default
-B, --broadcast=BCAST Broadcast inet addr
-M, --netmask=MASK Net mask address, default: 255.255.255.0
Exit status:
0 if OK,
!=0 if serious problems.
Example:
1) Use short options to create vm:
$ sudo $__ScriptName ../conf/kvm-origin.cfg -o rhel6_4 -D compact -p el6 -m 2048 -c 2 -n vm-test2 -H pepstack.com -i 192.168.122.61 -S ubuntu14.04 -G 192.168.122.1 -B 192.168.122.255 -M 255.255.255.0
2) Use long options to create vm:
$ sudo $__ScriptName ../conf/kvm-origin.cfg --origver=rhel6_4 --disksize=compact --path-prefix=el6 --memsize=2048 --vcpus=2 --vmname=vm-test3 --domain=pepstack.com --ipv4=192.168.122.63 --supervisor=ubuntu14.04 --gateway=192.168.122.1 --broadcast=192.168.122.255 --netmask=255.255.255.0
Report bugs to 350137278@qq.com
EOT
} # ---------- end of function usage ----------
if [ $# -eq 0 ]; then usage; exit 1; fi
ABSDIR=$(real_path $(dirname $0))
CFGFILE=
VMNAME=
DOMAIN=
IPADDR=
PATHPREFIX=
GATEWAY=
BDCAST=
NETMASK="255.255.255.0"
VERBOSE=false
SIZEMB=8192
VCPUS=4
ORIGVER="rhel6_4"
DISKSIZE="compact"
VMORIG="$ORIGVER:$DISKSIZE"
SUPERVISOR="ubuntu14.04"
# parse options:
RET=`getopt -o hVvo:D:p:m:c:n:H::i:S:G:T:B:M: \
--long help,version,verbose,origver:,disksize:,path-prefix:,memsize:,\
vcpus:,vmname:,domain::,ipv4:,supervisor:,gateway:,\
iftype:,broadcast:,netmask:\
-n ' * ERROR' -- "$@"`
if [ $? != 0 ] ; then echoerror "$__ScriptName exited with doing nothing." >&2 ; exit 1 ; fi
# Note the quotes around $RET: they are essential!
eval set -- "$RET"
# set option values
while true; do
case "$1" in
-h | --help ) usage; exit 1;;
-v | --verbose ) VERBOSE=true; shift ;;
-V | --version ) echoinfo "$(basename $0) -- version $__ScriptVersion"; exit 1;;
-o | --origver ) ORIGVER=$2
echoinfo "origin: $ORIGVER"
shift 2 ;;
-D | --disksize ) DISKSIZE=$2
echoinfo "origin size: $DISKSIZE"
shift 2 ;;
-p | --path-prefix ) PATHPREFIX=$2
echoinfo "subdir: $PATHPREFIX"
shift 2 ;;
-n | --vmname) VMNAME=$2
echoinfo "new vm name: $VMNAME"
shift 2 ;;
-H | --domain)
# domain-suffix has an optional argument. as we are in quoted mode,
# an empty parameter will be generated if its optional argument is not found.
case "$2" in
"" ) echowarn "--domain, no argument"; shift 2 ;;
* ) DOMAIN="$2" ; echoinfo "domain: $DOMAIN"; shift 2 ;;
esac ;;
-i | --ipv4) IPADDR=$2
echoinfo "static ipv4: $IPADDR"
shift 2 ;;
-m | --memsize ) SIZEMB=$2
echoinfo "memory: $SIZEMB mb"
shift 2 ;;
-c | --vcpus ) VCPUS=$2
echoinfo "cpu cores: $VCPUS"
shift 2 ;;
-S | --supervisor ) SUPERVISOR=$2
echoinfo "supervisor: $SUPERVISOR"
shift 2;;
-G | --gateway ) GATEWAY=$2
echoinfo "gateway: $GATEWAY"
shift 2 ;;
-T | --iftype ) IFTYPE=$2
echoinfo "network type: $IFTYPE"
shift 2 ;;
-B | --broadcast ) BDCAST=$2
echoinfo "broad cast: $BDCAST"
shift 2 ;;
-M | --netmask) NETMASK=$2
echoinfo "netmask: $NETMASK"
shift 2 ;;
-- ) shift; break ;;
* ) echoerror "internal error!" ; exit 1 ;;
esac
done
# config file must provided with remaining argument
for arg do
CFGFILE=$(real_path $(dirname $arg))'/'$(basename $arg)
done
if [ -f $CFGFILE ]; then
echoinfo "Config file: $CFGFILE"
else
echoerror "Config file not found: $CFGFILE"
exit 3
fi
##################### THIS IS ONLY A TEMPLATE SHELL FILE #####################
shell脚本处理长参数的模板的更多相关文章
- c++11变长参数函数模板
By francis_hao Mar 25,2018 一个最简单的实例大概是这个样子: #include <iostream>using namespace std; /*变长参 ...
- [Python]在python中调用shell脚本,并传入参数-02python操作shell实例
首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数 test_shell ...
- Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件
本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...
- shell脚本添加实例化参数
通过shell脚本给GMP系统添加一个环境变量参数dateSwitchTimeInterval 1. insert.sh #!/bin/sh . ~/apphome/aic_export.sh #连接 ...
- shell脚本学习- 传递参数
跟着RUNOOB网站的教程学习的笔记 我们可以在执行shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n代表一个数字,1为执行脚本的第一参数,2为执行脚本的第二个参数,以此类推... 实 ...
- Shell脚本之三 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推-- 实例 向脚本传递三个参数,并分 ...
- shell脚本获取的参数
$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表
- 向shell脚本中传入参数
写一个 程序名为 test.sh 可带参数为 start 和 stop 执行 test.sh start执行 start 内容的代码 执行 test.sh stop 执行 stop 内 ...
- C++11的模板新特性-变长参数的模板
这个特性很赞,直接给例子吧,假如我要设计一个类,CachedFetcher内部可能使用std::map也可能使用std::unordered_map,也可能是其它的map,怎么设计呢?没有C++11变 ...
随机推荐
- Android 多窗口
随着手机屏幕越来越大,单手操作手机越来越难,所以一些大厂早就开始研究多窗口,如iphone.samsung的单手模式,作为一个发展趋势google肯定也不会不考虑用户的体验,所以在android N中 ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- 自定义progressDialog(数据加载框)的实现
大家在开发客户端时基本上都需要获取数据,在获取数据时会有一个等待状态,这时我们可以利用系统自带的progressDialog来向用户展示"数据正在加载中..."等等,但有时我们会觉 ...
- 设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误
我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像 T ...
- SpriteKit:在场景过渡中暂停动画
Pausing Scenes During a Transition 你应该意识到两个重要的SKTrnsition属性在场景之间的过渡中. 它们是pausesIncomingScene和pausesO ...
- EJB3+JBoss5+Myeclipse9创建HelloWorld实例
本实例用到的工具 1. jboss5 (配置不做介绍,谷歌度娘都有) 2. MyEclipse 9 实例创建 1.EJB类创建 打开MyEclipse 9 中右上角如下选项 再新建一个EJB项目 新 ...
- JavaScript与jQuery获取相邻控件
原始代码如下,需求是onclick中的OpenIframe方法捕捉到input中的value值,由于某些限制无法使用正常的操作dom根据name值来取,所以决定通过相邻空间的方式获取 <div& ...
- API创建员工支付方式
DECLARE ln_method_id PAY_PERSONAL_PAYMENT_METHODS_F.PERSONAL_PAYMENT_METHOD_ID%TYPE; ln_ext_acc_id P ...
- java内存垃圾回收模型
一.java的内存模型 介绍如下6个组成部分 1.程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是N ...
- Java并发框架——AQS阻塞队列管理(三)——CLH锁改造
在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点 ...