【问题标题】:Set specific option sets for arguments in bash为 bash 中的参数设置特定选项集
【发布时间】:2018-05-17 07:43:16
【问题描述】:

我有一个脚本,我可以在其中为脚本必须执行的工作传递不同的参数集。选项指定如下:

[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>

【问题讨论】:

    标签: linux bash getopts


    【解决方案1】:

    我认为您在此处对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
    

    注意,答案确实考虑了交换标志顺序的选项,即如果不允许./myscript.sh -h -c -f &lt;file_name&gt;,是否应该允许./myscript.sh -f &lt;file_name&gt; -h -c?需要根据此修改答案。

    【讨论】:

      【解决方案2】:

      我为此使用了 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
      

      有没有更好的方法来做同样的检查?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-18
        • 1970-01-01
        • 2014-08-27
        相关资源
        最近更新 更多