我不是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
我忘了提。这是脚本的一部分。此外,如果选择了两个以上的选项,那么在某些情况下可能会发生冲突。
编辑:有效选择恰好是一个选项或零,但不是两个或多个!
答案 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"
的值切换功能。