shell脚本中getopt介绍

  介绍

        使用过linux命令的都用过xxx -a --append  -f a.tar.gz  /etc/temp这种类型的命令

上面的命令包含了短选项、长选项、参数、选项参数

例如"-a"是短选项,"--append"是长选项,a.tar.gz是选项“-f”的选项参数(传递给选项的参数),/etc/temp则只是参数,为非选项参数

bash的getopt命令经常用在shell脚本内部或函数内部,用来解析脚本执行或函数执行时传递的选项、参数

getopt -o SHORT_OPTIONS -l LONG_OPTIONS -n "$0" -- "$@"

-o SHORT_OPTIONS 或 --options SHORT_OPTIONS

getopt通过“-o”收集传递的短选项和它们对应的参数

-l LONG_OPTIONS或--longoptions LONG_OPTIONS或--long LONG_OPTIONS

同上,长选项用-l或者后面2个

-n NAME

getopt在解析命令行时,如果解析出错则执行NAME脚本

-- "$@"

其中--表示getopt命令自身的选项到此结束,后面的元素都是要被getopt解析的命令行参数,"$@"表示所有命令行参数

 

 getopt解析短选项时:

多个短选项开易连接在一起

如果某个短选项需要一个参数,则在选项后面跟一个冒号

如果某个短选项参数可选,则跟两个冒号

例如:getopt -o ab:c::,解析为:-a -b arg_b -c [arg_c] ,arg_b是"-b"选项必须的,arg_c是"-c"选项可选的,-a无须参数

getopt解析长选项时:

可以一次性指定多个选项名称,但是用逗号分开

可以多次使用-l选项,多次解析长选项

如果某个短选项需要一个参数,则在选项后面跟一个冒号

如果某个短选项参数可选,则跟两个冒号

例如:getopt -l add:,remove::,show,其实和上面的短选项类似,不做说明

getopt解析后处理

ARGS=`getopt -o hc:p:: --long help,case: -n 'run.sh' -- "$@"`
eval set -- "${ARGS}" #将规范化后的命令行参数分配至位置参数($1,$2,...)

while [ -n "$1" ]
do
    case "$1" in  #循环解析第一个参数
     -h|--help)
         test_run_help
         ;;
     -c|--case)
         case="$2"
         shift
         ;;
     -p)
         case "$2" in
             "") echo "Option p, no argument"; shift ;;
             *)  echo "Option p, argument \`$2'" ; shift ;;
         esac ;;
     --)
         shift ;
         break
         ;;
     *)
         break
    esac
    shift
done

./test.sh -c aa -pvv

Option p, argument `vv'

 上面的命令中用到了eval、set和shift

eval

对其后面的命令再次进行shell解析

#:cat file

hello world

#:test = "cat file"

#:echo $test

cat file

#:eval $test  #这里相当于二次解析了,执行了cat file命令

hello world

set --

根据分隔符依次把值赋给$1 $2 $3... ...

# cat test.sh 
#!/bin/bash
echo $1 $2 $3
set -- aa bb cc  #这里就被替换成了aa bb cc
echo $1 $2 $3  
# sh test.sh a b c
a b c
aa bb cc

 shift

将参数左移n个,可以理解成为删除前n个参数,即$1、$2。。。。。

# cat test.sh 
#!/bin/bash
set -- aa bb cc
echo $1 $2 $3
shift 1 #这里删除$1,参数只剩bb cc
echo $1 $2 $3 
# sh test.sh 
aa bb cc
bb cc

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值