使用getopt命令解析shell脚本的命令行选项
来源:互联网 发布:js div添加点击事件 编辑:程序博客网 时间:2024/06/06 13:07
在之前的一篇文章中,介绍了如何利用shell内置的getopts命令来帮助我们处理shell脚本选项和参数,其缺点是只能处理短选项,无法处理长选项。下面,本文将要介绍的是getopt命令,它可以同时处理短选项和长选项。
首先,getopt命令不是一个标准的unix命令,但它在大多数Linux的发行版中都自带了有,如果没有,也可以从getopt官网上下载安装。
在getopt的较老版本中,存在一些bug,不大好用,在后来的版本中解决了这些问题,我们称之为getopt增强版。通过-T选项,我们可以检查当前的getopt是否为增强版,返回值为4,则表明是增强版的。
#getopt -T#echo $?4#getopt -Vgetopt (enhanced) 1.1.4
getopt命令与getopts命令不同,它实际上是通过将参数规范化来帮助我们处理的。具体的用法,如下面的脚本:
#!/bin/bash#echo $@#-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的#-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。#-n选项后接选项解析错误时提示的脚本名字ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`if [ $? != 0 ]; then echo "Terminating..." exit 1fi#echo $ARGS#将规范化后的命令行参数分配至位置参数($1,$2,...)eval set -- "${ARGS}"while truedo case "$1" in -a|--along) echo "Option a"; shift ;; -b|--blong) echo "Option b, argument $2"; shift 2 ;; -c|--clong) case "$2" in "") echo "Option c, no argument"; shift 2 ;; *) echo "Option c, argument $2"; shift 2; ;; esac ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esacdone#处理剩余的参数for arg in $@do echo "processing $arg"done
需要注意的是,像上面的-c选项,后面是可接可不接参数的,如果需要传递参数给-c选项,则必须使用如下的方式:
#./getopt.sh -b 123 -a -c456 file1 file2 Option b, argument 123Option aOption c, argument 456processing file1processing file2#./getopt.sh --blong 123 -a --clong=456 file1 file2 Option b, argument 123Option aOption c, argument 456processing file1processing file2
#!/bin/bash# @Function# Find out the highest cpu consumed threads of java, and print the stack of these threads.## @Usage# $ ./show-busy-java-threads.sh## @author Jerry LeePROG=`basename $0`usage() { cat <<EOFUsage: ${PROG} [OPTION]...Find out the highest cpu consumed threads of java, and print the stack of these threads.Example: ${PROG} -c 10Options: -p, --pid find out the highest cpu consumed threads from the specifed java process, default from all java process. -c, --count set the thread count to show, default is 5 -h, --help display this help and exitEOF exit $1}ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`[ $? -ne 0 ] && usage 1eval set -- "${ARGS}"while true; do case "$1" in -c|--count) count="$2" shift 2 ;; -p|--pid) pid="$2" shift 2 ;; -h|--help) usage ;; --) shift break ;; esacdonecount=${count:-5}redEcho() { [ -c /dev/stdout ] && { # if stdout is console, turn on color output. echo -ne "\033[1;31m" echo -n "$@" echo -e "\033[0m" } || echo "$@"}# Check the existence of jstack command!if ! which jstack &> /dev/null; then [ -z "$JAVA_HOME" ] && { redEcho "Error: jstack not found on PATH!" exit 1 } ! [ -f "$JAVA_HOME/bin/jstack" ] && { redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!" exit 1 } ! [ -x "$JAVA_HOME/bin/jstack" ] && { redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!" exit 1 } export PATH="$JAVA_HOME/bin:$PATH"fiuuid=`date +%s`_${RANDOM}_$$cleanupWhenExit() { rm /tmp/${uuid}_* &> /dev/null}trap "cleanupWhenExit" EXITprintStackOfThread() { while read threadLine ; do pid=`echo ${threadLine} | awk '{print $1}'` threadId=`echo ${threadLine} | awk '{print $2}'` threadId0x=`printf %x ${threadId}` user=`echo ${threadLine} | awk '{print $3}'` pcpu=`echo ${threadLine} | awk '{print $5}'` jstackFile=/tmp/${uuid}_${pid} [ ! -f "${jstackFile}" ] && { jstack ${pid} > ${jstackFile} || { redEcho "Fail to jstack java process ${pid}!" rm ${jstackFile} continue } } redEcho "Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):" sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile} done}ps -Leo pid,lwp,user,comm,pcpu --no-headers | { [ -z "${pid}" ] && awk '$4=="java"{print $0}' || awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'} | sort -k5 -r -n | head --lines "${count}" | printStackOfThread
https://github.com/oldratlee/useful-scripts ----------------------->脚本来源
阅读全文
0 0
- 使用getopt命令解析shell脚本的命令行选项
- 使用getopt命令解析shell脚本的命令行选项
- 使用getopt命令解析shell脚本的命令行选项
- 解析命令行选项参数的 getopt函数
- getopt解析命令行选项参数
- Kaldi shell 脚本解析命令行选项
- 命令行程序选项解析函数—getopt
- 命令行程序选项解析函数—getopt
- 命令行程序选项解析函数—getopt
- 解析命令行选项参数函数getopt()
- 命令行选项参数解析-getopt函数
- 使用Getopt::Long来处理复杂的命令行选项
- [Shell]命令行选项解析
- getopt函数,命令选项解析函数的分析
- 使用getopt解析命令行参数
- 使用getopt解析命令行参数
- 使用getopt模块处理命令行选项
- 使用getopt模块获取命令行选项
- tcp/ip-路由相关结构
- Android中轮播图的实现
- 二叉树的子树 解题报告
- Python 通过whl后缀安装scipy
- vertical-align属性
- 使用getopt命令解析shell脚本的命令行选项
- phaIcon问题
- FTP 服务器的上传和下载
- 属性选择器
- Sublime text 2/3 中 Package Control 的安装与使用方法
- es6新增内容简单概览
- mui的使用
- HDU 6214 Smallest Minimum Cut(求最小割的最少边数)
- Google Dapper 大规模分布式系统的跟踪方案