首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash脚本:要求每个选项参数最多出现一次

Bash脚本:要求每个选项参数最多出现一次
EN

Stack Overflow用户
提问于 2015-07-10 06:45:27
回答 3查看 277关注 0票数 2

我正在用unix编写一个脚本,它将以选项作为参数,如下所示:

代码语言:javascript
运行
复制
./command -pers

允许的选项是pers,可以按任何顺序排列,也可以是可选的。例如,这些语法是正确的:./command -e./command -sr./command -pes,但是这个语法是不正确的./command -pep./command -ssr。不允许重复选项,但至少需要一个选项。

同样,我使用了正则表达式,但这并不能避免重复。

但它允许重复。请告诉我这句话的意思。

代码语言:javascript
运行
复制
[[ $1 =~ ^-[p{0,1}r{0,1}s{0,1}e{0,1}]{1,4}$ ]] || { echo "$MSG_INCORRECT_USAGE"; }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-10 07:16:31

您可以使用像这样的脚本opt.sh,避免多次处理每个传递的选项()

代码语言:javascript
运行
复制
#!/bin/bash

while getopts "pers" opt; do
  [[ -n ${!opt} ]] && { echo "Error: $opt already processed"; exit 1; } || declare $opt=1

  case $opt in
    p) echo "processing p!" ;;
    e) echo "processing e!" ;;
    r) echo "processing r!" ;;
    s) echo "processing s!" ;;
    \?) echo "Invalid option: -$OPTARG" ;;
  esac
done

测试:

代码语言:javascript
运行
复制
bash ./opt.sh -srr
processing s!
processing r!
Error: r already processed

bash ./opt.sh -pep
processing p!
processing e!
Error: p already processed

bash ./opt.sh -pers
processing p!
processing e!
processing r!
processing s!
票数 1
EN

Stack Overflow用户

发布于 2015-07-10 07:03:10

代码语言:javascript
运行
复制
#!/bin/bash

while getopts "pers" OPTION; do
        echo $OPTION
done

结果:

代码语言:javascript
运行
复制
$ bash test.sh -pers
p
e
r
s

echo $OPTION替换为case语句,如果选项出现两次,则报告错误。示例:

代码语言:javascript
运行
复制
#!/bin/bash

unset OPT_P OPT_E OPT_R OPT_S

while getopts "pers" OPTION; do
    case $OPTION in
    p)
        if [ $OPT_P ]; then
            echo "-p appeared twice"
            exit 64
        else
            OPT_P="true"
        fi
        ;;
    #... and so on ...
    \?)
        echo "Unrecognized option $OPTION"
        exit 64
        ;;
done
票数 1
EN

Stack Overflow用户

发布于 2015-07-10 07:21:19

代码语言:javascript
运行
复制
arg0=$(basename $0 .sh)
error() { echo "$arg0: $*" >&2; exit 1; }
usage() { echo "Usage: $arg0 [-pers]" >&2; exit 1; }

p_flag=
e_flag=
r_flag=
s_flag=

while getopts pers arg
do
    case "$arg" in
    (e) [ -z "$e_flag" ] || error "-e flag repeated"
        e_flag=1;;
    (p) [ -z "$p_flag" ] || error "-p flag repeated"
        p_flag=1;;
    (r) [ -z "$r_flag" ] || error "-r flag repeated"
        r_flag=1;;
    (s) [ -z "$s_flag" ] || error "-s flag repeated"
        s_flag=1;;
    (*) usage;;
    esac
done

shift $(($OPTIND - 1))

[ -z "$e_flag$p_flag$r_flag$s_flag" ] && error "You must specify one of -e, -p, -r, -s"
[ $# = 0 ] || error "You may not specify any non-option arguments"

…process the code for each option that was set…

如果您需要按照给定的顺序处理这些选项,那么您需要记录它们到达的顺序。使用数组:

代码语言:javascript
运行
复制
flags=()

在循环之前,和

代码语言:javascript
运行
复制
flags+=("$arg")

esac之后。然后,处理可以按顺序处理$flags的每个元素。

代码语言:javascript
运行
复制
for flag in "${flags[@]}"
do
    …processing for the particular flag…
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31334180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档