我有一个脚本,我可以在其中为脚本必须完成的工作传递不同的参数集。选项指定如下:
[Show Help] ./myscript.sh -h
[To Create] ./myscript.sh -c -f /input_loc/input_file.txt
[To Export] ./myscript.sh -e -d /destination_loc/exported_db_date.csv
[To Import] ./myscript.sh -i -s /source_loc/to_import_date.csv
脚本 myscript.sh
有 getopts
来解析选项,然后将其推送到 case - esac
以应用检查和逻辑通过每个参数来检查其有效性。例如,如下所示:
while getopts "cd:ef:his:" o; do
case "${o}" in
Put options and their check logics
esac
done
我的问题是,我可以使用什么逻辑来强制仅在特定集合中呈现参数,例如
Allowed Option set
./myscript.sh -h
./myscript.sh -c -f <file_name>
./myscript.sh -e -d <file_name>
./myscript.sh -i -s <file_name>
NOT Allowed Option set
./myscript.sh -h -c -f <file_name>
./myscript.sh -h -d <file_name>
./myscript.sh -e -s <file_name>
./myscript.sh -c -i -f <file_name>
最佳答案
我认为你对 getopts()
的具体用法这里只需要首先解析有效的选项标志并将它们放入数组中,然后使用解析后的标志来确保仅设置了所需的标志顺序。
涉及的步骤有两个。首先将有效标志解析为数组( multi
),然后将这些标志连接在一起(不带空格),并对提供的标志进行正则表达式匹配,如果遇到不允许的标志,请不要执行您的逻辑。
#!/usr/bin/env bash
while getopts "cd:ef:his:" opt; do
case "$opt" in
c|d|e|f|h|i|s) multi+=("$opt");;
*) printf 'invalid flag provided' 1>&2 ; exit 1 ;;
esac
done
joined=$(IFS=;echo "${multi[*]}")
if ! [[ $joined =~ ^(hcf|hd|es|cif)$ ]]; then
printf 'valid flags provided\n'
# Add your logic here
fi
请注意,答案确实考虑了交换标志顺序的选项,即 if ./myscript.sh -h -c -f <file_name>
不允许,应该 ./myscript.sh -f <file_name> -h -c
被)允许?需要在此基础上修改答案。
关于linux - 为 bash 中的参数设置特定选项集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50385962/