gpt4 book ai didi

bash - 是否可以指定执行 getopts 条件的顺序?

转载 作者:行者123 更新时间:2023-11-29 09:34:51 24 4
gpt4 key购买 nike

在 bash 脚本中,我想从配置文件加载设置并使用命令行选项覆盖各个设置。如果在配置文件和命令行中都指定了设置,则命令行设置应优先。

如何确保在其他 getopts block 之前加载配置文件?这是我得到的:

#!/bin/bash
# ...

while getopts “c:l:o:b:dehruwx” OPTION
do
case $OPTION in
c)
echo "load"
CONFIG_FILE=$OPTARG
# load_config is a function that sources the config file
load_config $CONFIG_FILE
;;
l)
echo "set local"
LOCAL_WAR_FILE=$OPTARG
;;

# ...

esac
done
shift $(($OPTIND - 1))

无论我为 -c 选项设置处理程序的顺序如何,它总是在设置其他选项后加载配置文件。这使得将配置文件设置与命令行选项合并变得更加痛苦。

最佳答案

每次调用 getopts 总是处理“下一个”选项(通过检查 $OPTIND 确定),因此您的 while 循环将必须按选项出现的顺序处理选项。

由于您希望 -c 被其他选项部分取代,即使它在命令行中出现在它们之后,您也可以采取一些方法。

一个是循环选项两次:

#!/bin/bash
# ...

optstring='c:l:o:b:dehruwx'

while getopts "$optstring" OPTION
do
case $OPTION in
c)
echo "load"
CONFIG_FILE=$OPTARG
# load_config is a function that sources the config file
load_config $CONFIG_FILE
esac
done

OPTIND=1

while getopts "$optstring" OPTION
do
case $OPTION in
l)
echo "set local"
LOCAL_WAR_FILE=$OPTARG
;;
# ...
esac
done
shift $(($OPTIND - 1))

另一种方法是将选项保存在 -c 不会 覆盖的变量中,然后将它们复制过来:

#!/bin/bash
# ...

while getopts c:l:o:b:dehruwx OPTION
do
case $OPTION in
c)
echo "load"
CONFIG_FILE=$OPTARG
# load_config is a function that sources the config file
load_config $CONFIG_FILE
;;
l)
echo "set local"
LOCAL_WAR_FILE_OVERRIDE=$OPTARG
;;
# ...
esac
done
shift $(($OPTIND - 1))

LOCAL_WAR_FILE="${LOCAL_WAR_FILE_OVERRIDE-${LOCAL_WAR_FILE}}"

(或者,相反,配置文件可以设置LOCAL_WAR_FILE_DEFAULT之类的选项,然后您可以编写LOCAL_WAR_FILE="${LOCAL_WAR_FILE-${LOCAL_WAR_FILE_DEFAULT}}" .)

另一种选择是要求 -c(如果存在)。您可以先自己处理它:

if [[ "$1" = -c ]] ; then
echo "load"
CONFIG_FILE="$2"
# load_config is a function that sources the config file
load_config "$CONFIG_FILE"
shift 2
fi

然后在您的主 while 循环中,通过打印一条错误消息来处理 -c

另一种是简单地记录您现有的行为并将其称为“功能”。许多 Unix 实用程序都有更新的选项取代早期的选项,因此这种行为并不是真正的问题。

关于bash - 是否可以指定执行 getopts 条件的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15079009/

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