shell脚本接参数优美用法

shell脚本接参数优美用法

学习 bash

1. 示例脚本

#!/usr/bin/env bash#Bash脚本接参数优美用法#Create on 2016-11-18#@author: Chinge_Yang

args="$*"

function usage(){    echo "Usage: `basename $0` options (-h HOST|-n NAME)"}

function check(){    echo "check"}

if [ $# -lt 4 ]  then    usage    exit 55     fi  

# 用法: scriptname -options# 注意: 必须使用破折号 (-) # 第一个冒号表示忽略错误,参数后接冒号,表示必须接值while getopts ":h:n:" Option;do  case $Option in    h)    host=$OPTARG    ;;    n)    name=$OPTARG    ;;    *)    usage    ;;   # 默认情况的处理  esacdone

shift $(($OPTIND - 1))#  (译者注: shift命令是可以带参数的, 参数就是移动的个数)#  将参数指针减1, 这样它将指向下一个参数.#  $1 现在引用的是命令行上的第一个非选项参数,#+ 如果有一个这样的参数存在的话.

check

exit 0

2. 转载阅读

转载阅读:shell中的getopt与getopts

在shell脚本之shift和getopts篇中有提到getopts,除了bash自带的内部变量getopts外,util-linux-ng包还提供了一个工具getopt ,该工具较bash内置的getopts更强大,其不仅支持短参-s,还支持–longopt的长参数,甚至支持-longopt的简化参数。相较于getopts ,getopt 不但支持长短选项,其还支持选项和参数放在一起写。

2.1 getopt命令的用法

getopt [options] -o|–options optstring [options] [–] parameters 
选项说明:

-a:使getopt长参数支持”-“符号打头,必须与-l同时使用

-l:后面接getopt支持长参数列表

-n program:如果getopt处理参数返回错误,会指出是谁处理的这个错误,这个在调用多个脚本时,很有用

-o:后面接短参数列表,这种用法与getopts类似

-u:不给参数列表加引号,默认是加引号的(不使用-u选项),例如在加不引号的时候 –longoption “arg1 arg2” ,只会取到”arg1”,而不是完整的”arg1 arg2”

其有两种使用方法,如下

方法1:

ARGV=($(getopt -o 短选项1[:]短选项2[:]...[:]短选项n -l 长选项1,长选项2,...,长选项n -- "[email protected]"))for((i = 0; i < ${#ARGV[@]}; i++)) {    eval opt=${ARGV[$i]}    case $opt in    -短选项1|--长选项1)       process       ;;    # 带参数    -短选项2|--长选项2)       ((i++));       eval opt=${ARGV[$i]}       ;;    ...    -短选项n|--长选项n)       process       ;;    --)       break       ;;    esac}

方法2:

ARGV=($(getopt -o 短选项1[:]短选项2[:]...[:]短选项n -l 长选项1,长选项2,...,长选项n -- "[email protected]"))eval set -- "$ARGV"while truedo    case "$1" in    -短选项1|--长选项1)        process        shift        ;;    -短选项2|--长选项2)        # 获取选项        opt = $2        process        shift 2        ;;    ......    -短选项3|--长选项3)        process        ;;    --)break;;esac}

注意:如果getopt命令本身没有使用-o|–option选项的话,那么–后面的第一个参数被当做短选项。

2.2 示例

#!/bin/bash# A small example program for using the new getopt(1) program.# This program will only work with bash(1)# Note that we use `"[email protected]"‘ to let each command-line parameter expand to a# separate word. The quotes around `[email protected]‘ are essential!# We need TEMP as the `eval set --‘ would nuke the return value of getopt.TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: -n ‘example.bash‘ -- "[email protected]"`if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi# Note the quotes around `$TEMP‘: they are essential!eval set -- "$TEMP"while true ; do        case "$1" in                -a|--a-long) echo "Option a" ; shift ;;                -b|--b-long) echo "Option b, argument \`$2‘" ; shift 2 ;;                -c|--c-long)                        # c 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                                "") echo "Option c, no argument"; shift 2 ;;                                *)  echo "Option c, argument \`$2‘" ; shift 2 ;;                        esac ;;                --) shift ; break ;;                *) echo "Internal error!" ; exit 1 ;;        esacdoneecho "Remaining arguments:"for arg do echo ‘--> ‘"\`$arg‘" ; done 

运行结果如下:

[[email protected] bash]# sh get.sh -a par1 ‘another arg‘ --c-long ‘wow!*\?‘ -cmore -b " very long "Option aOption c, no argumentOption c, argument `more‘Option b, argument ` very long ‘Remaining arguments:--> `par1‘--> `another arg‘--> `wow!*\?‘

使用eval 的目的是为了防止参数中有shell命令,被错误的扩展。

平时使用时,可以使用的样例为:

ARGS=`getopt -a -o I:D:T:e:k:LMSsth -l instence:,database:,table:,excute:,key:,list,master,slave,status,tableview,help -- "[email protected]"`[ $? -ne 0 ] && usage#set -- "${ARGS}"eval set -- "${ARGS}"while truedo        case "$1" in        -I|--instence)                instence="$2"                shift                ;;        -D|--database)                database="$2"                shift                ;;        -T|--table)                table="$2"                shift                ;;        -e|--excute)                excute="yes"                shift                ;;        -k|--key)                key="$2"                shift                ;;        -L|--list)                LIST="yes"                ;;        -M|--master)                MASTER="yes"                ;;        -S|--slave)                SLAVE="yes"                ;;        -A|--alldb)                ALLDB="yes"                ;;        -s|--status)                STATUS="yes"                ;;        -t|--tableview)                TABLEVIEW="yes"                ;;        -h|--help)                usage                ;;        --)                shift                break                ;;        esacshiftdone
时间: 2024-10-09 09:19:36

shell脚本接参数优美用法的相关文章

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

vim,grep,shell脚本实例及find用法

vim,grep,shell脚本实例及find用法 1.定义一个对所有用户都生效的命令别名 定义一个对所有用户都生效的命令别名需要更改全局配置文件/etc/bashrc, 例如,我们以root用户编辑/etc/bashrc,在文件的最后一行增加alias like='ls' 当我们新启一个shell进程的时候,列出命令别名,会发现刚定义的别名like [[email protected] ~]# tail /etc/bashrc . "$i" >/dev/null fi fi d

对于shell脚本获取参数的一些小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i  取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的 当时纠结了好久,最后上百度提问,两位高手给出了答案: 1) #!/bin/sh NUMBER=$# echo $NUMBER i=1 while [ $i -le $NUMBER ] do a[$i]=$1 #将数组a[i]赋值为$1,即取

vim编辑器简介;shell脚本的参数;yum仓库配置

1. vim编辑器 命令模式:dd:删除(剪切)光标所在整行:ndd:删除(剪切)光标处开始的n行:yy:复制光标所在整行:nyy:复制从光标开始处的n行:u:撤销上一步的操作:p:将之前删除(dd)或复制(yy)过的数据粘贴到光标后面:输入模式:进入:a或i或o:a:在光标后面以为切换到输入模式:i:在光标当前位置切换到输入模式:o:在光标的下面再创建一个空行:退出到命令模式:Esc键':'或末行模式::w 保存:q 退出:wq! 强制保存退出:q! 强制退出(放弃对文档的修改):set nu

Shell脚本中‘‘ () {} [] &quot; &quot; [[]] ``的不同用法

[[]]在脚本的使用中作用一是来匹配扩展正则表达式用法[[ =~ ]]例如: [[email protected] data]# touch f1.sh[[email protected] data]# file=f1.sh ;[[ $file =~ \.sh$ ]][[email protected] data]# echo $?0[[email protected] data]# file=f1.shsh ;[[ $file =~ \.sh$ ]][[email protected] dat

linux shell脚本通过参数名传递参数值

平常在写shell脚本都是用$1,$2....这种方式来接收参数,然而这种接收参数的方式不但容易忘记且不易于理解和维护.Linux常用的命令都可指定参数名和参数值,然而我们怎样才能给自己的shell脚本也采用参数名和参数值这样的方式来获取参数值呢?而不是通过$1,$2这种方式进行获取.下面的例子定义了短参数名和长参数名两种获取参数值的方式.其实是根据getopt提供的特性进行整理而来. #!/bin/sh #说明 show_usage="args: [-l , -r , -b , -w]\ [-

shell脚本中case的用法

shell脚本中case选择语句可以结合read指令实现比较好的交互应答操作,case接收到read指令传入的一个或多个参数,然后case根据参数做选择操作. case的语法如下 case $char in C | c ) command 1 ;; #每一个选择都以双 ;; 结束 M | m ) command 2 ;; * ) # * 未匹配到相符的其他值 echo "error" ;; esac #case的结束语句是以esac 结束 下面结合一个简单的小功能使用,脚本中同时也用到

使用getopt处理shell脚本的参数

getopt命令并不是bash的内建命令,它是由util-linux包提供的外部命令.相比较bash 的内置命令,getopt不只支持短参-s,还支持--longopt的长参数,甚至支持-longopt的简化参数.getopt可以用于tcsh其它的shell.现在就以系统自带的帮助文件,说说getopt在bash下的使用技巧. #!/bin/bash   # A small example program for using the new getopt(1) program.  # This

shell脚本之awk基本用法

脚本文件: [email protected]:/study/shell# cat awk_test.sh #!/bin/sh awk_test_fun() { echo "\$0:" echo $0 echo "\$1:" echo $1 echo "\$2:" echo $2 echo "\$3:" echo $3 echo "awk_test.txt content:" cat awk_test.tx