我有一个脚本,我可以为脚本必须执行的工作传递不同的参数集。选项如下:
[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>
答案 0 :(得分:1)
我已经使用了if ... elif ... else循环
#!/bin/bash
my_ary=("$@")
LEN=${#my_ary[@]}
if [[ ${my_ary[0]} =~ "-h" && $LEN -eq 1 ]] || \
[[ ${my_ary[0]} =~ "-c" && ${my_ary[1]} =~ "-f" && $LEN -eq 3 ]] || \
[[ ${my_ary[0]} =~ "-e" && ${my_ary[1]} =~ "-d" && $LEN -eq 3 ]] || \
[[ ${my_ary[0]} =~ "-i" && ${my_ary[1]} =~ "-s" && $LEN -eq 3 ]]; then
echo "Proper set of arguments passed"
else
echo "You are not passing arguments in proper sets, please look at Usage once again..."
fi
有更好的方法进行相同的检查吗?
答案 1 :(得分:1)
我认为此处getopts()
的具体用法仅需要先解析有效选项标志并将它们放入数组中,然后再使用解析后的标志来确保只有设置了所需的标志顺序。< / p>
所涉及的步骤是双重的。首先将有效标志解析为数组(multi
),然后将标志连接在一起,没有空格,并在提供的标志上进行正则表达式匹配,如果遇到不允许的标记则不进行逻辑。< / p>
#!/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
注意,答案确实考虑了交换标记顺序的选项,即如果不允许./myscript.sh -h -c -f <file_name>
,是否应该允许./myscript.sh -f <file_name> -h -c
?需要根据这个修改答案。