gpt4 book ai didi

bash - 在 bash 中,如何确定一组变量中是否只有一个有值?

转载 作者:行者123 更新时间:2023-11-29 09:36:01 25 4
gpt4 key购买 nike

我有三个变量,我们称它们为 DATEURIURI_FILE。它们包含使用 getopt 处理命令行的结果:

while getopts ":d:p:u:hFA" opt; do

case $opt in
d) DATE=$OPTARG;;
u) URI=${OPTARG};;
U) URI_FILE=${OPTARG};;
F) FORCE=yes;;
A) ALL=yes;;

esac

done

如果多个变量被设置为任何值(它们是备用命令行选项),我需要失败并显示错误。我完全不知道如何优雅地测试它。我有一些看起来像的东西:

#!/bin/bash 

if [[ -z "${URI+x}" ]]
then
URI_PRESENT=0
else
URI_PRESENT=1
fi

if [[ -z "${URI_FILE+x}" ]]
then
URI_FILE_PRESENT=0
else
URI_FILE_PRESENT=1
fi

if [[ -z "${DATE+x}" ]]
then
DATE_PRESENT=0
else
DATE_PRESENT=1
fi


ARGCOUNT=$((${DATE_PRESENT} + ${URI_FILE_PRESENT} + ${URI_PRESENT}))

if (( ${ARGCOUNT} > 1 ))
then
echo "Only one of date, uri and uri-file may be supplied"
exit 1
fi

必须有一种更简洁的方法来做到这一点。建议?我将至少添加更多替代方案,这会很痛苦

最佳答案

来自 mickp's comment :

Why not have a single flag which gets incremented in every case expression and then test if it's greater than 1?

已实现:

while getopts ":d:p:u:hFA" opt; do
case $opt in
d) DATE=$OPTARG
((count++));;
u) URI=${OPTARG}
((count++));;
U) URI_FILE=${OPTARG}
((count++));;
F) FORCE=yes;;
A) ALL=yes;;
esac
if ((count > 1)); then
echo "Only one of date, uri or uri-file may be supplied" >&2
exit 1
fi
done

关于bash - 在 bash 中,如何确定一组变量中是否只有一个有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com