从shellscript中选择了一个选项,或者都不选择

时间:2018-09-11 12:43:20

标签: bash shell

我不是bash脚本方面的专家,并且正在寻求帮助。我想从while循环条件中找到一种方法,除非选择了一个选项( [-1 | -2 | -3] )或没有一个选项,否则可以执行脚本。

最佳方法是什么?我完全不知道该怎么做。 非常感谢。

#!/bin/bash

echo "  $0 [-e <option_e>] [-f <option_f>]  [-1|-2|-3] [user@]fqdn"

OPTION1=""
OPTION2=""
OPTION3=""

while (( "$#" )); do
    if [ "$1" == "-1" ]; then
        OPTION1=1
    elif [ "$1" == "-2" ]; then
        OPTION2=1
    elif [ "$1" == "-3" ]; then
        OPTION3=1
    fi

   shift
done

我忘了提。这是脚本的一部分。此外,如果选择了两个以上的选项,那么在某些情况下可能会发生冲突。

编辑:有效选择恰好是一个选项或零,但不是两个或多个!

3 个答案:

答案 0 :(得分:1)

谢谢SamuelKirschner- 我确实添加了[[-n $ ALL_OPTS]] &&然后成功了!我现在很开心。

#!/bin/bash

OPTION1=""
OPTION2=""
OPTION3=""

while (( "$#" )); do
    if [ "$1" == "-1" ]; then
        OPTION1=1
    elif [ "$1" == "-2" ]; then
        OPTION2=1
    elif [ "$1" == "-3" ]; then
        OPTION3=1
    fi

   shift
done

ALL_OPTS="$OPTION1$OPTION2$OPTION3";
echo $ALL_OPTS
if [[ -n $ALL_OPTS ]] && [[ $ALL_OPTS -ge 2 ]];then
    echo 'Please provide a maximum of one of the options [-1|-2|-3]' 1>&2
    exit 1
fi

答案 1 :(得分:0)

您可以简单地使用ALL_OPTS="$OPTION1$OPTION2$OPTION3"; test ${#ALL_OPTS} -ge 2测试所有隐含的OPTION变量的长度是否错误并退出。 "$OPTION1$OPTION2$OPTION3"只是彼此相邻写的所有变量,因此它是“”,“ 1”,“ 11”或“ 111”。

#!/bin/bash

echo "  $0 [-e <option_e>] [-f <option_f>]  [-1|-2|-3] [user@]fqdn"

OPTION1=""
OPTION2=""
OPTION3=""

while (( "$#" )); do
    if [ "$1" == "-1" ]; then
        OPTION1=1
    elif [ "$1" == "-2" ]; then
        OPTION2=1
    elif [ "$1" == "-3" ]; then
        OPTION3=1
    fi

   shift
done

ALL_OPTS="$OPTION1$OPTION2$OPTION3";
if test ${#ALL_OPTS} -ge 2; then
    echo 'Please provide a maximum of one of the options [-1|-2|-3]' 1>&2
    exit 1
fi

来自man bash

  

$ {#parameter}

     

参数长度。参数值的字符长度被替换。 [...]

编辑:我把情况弄得一团糟。 (原始答案为test -z "$OPTION1$OPTION2$OPTION3"

答案 2 :(得分:0)

可能会保留很多选项。使用getopts

successEndpoint

或者,您可以将数字选项保留在变量中,可以使用全局变量进行检查:

#!/usr/bin/env bash

echo "${0##*/} [-e <option_e>] [-f <option_f>]  [-1|-2|-3] [user@]fqdn"

count=0

while getopts e:f:123 opt; do
  case "$opt" in
    e) opt_e="$OPTARG" ;;
    f) opt_f="$OPTARG" ;;
    1|2|3) declare opt_$opt=true; ((count++)) ;;
  esac
done
shift $((OPTIND-1))

# Fail if our counter is too high
((count>1)) && printf 'ERROR: only one digit option allowed.\n' >&2 && exit 1

echo "done"

然后,您可以根据#!/usr/bin/env bash echo "${0##*/} [-e <option_e>] [-f <option_f>] [-1|-2|-3] [user@]fqdn" nopt="" while getopts e:f:123 opt; do case "$opt" in e|f) declare opt_$opt="$OPTARG" ;; 1|2|3) nopt="$nopt$opt" ;; esac done shift $((OPTIND-1)) # Fail if we collected too many digits ((${#nopt}>1)) && printf 'ERROR: only one digit option allowed.\n' >&2 && exit 1 echo "done" 的值切换功能。