Установить конкретные наборы параметров для аргументов в bash - PullRequest
0 голосов
/ 17 мая 2018

У меня есть скрипт, в котором я могу передать другой набор аргументов для работы, которую должен выполнить скрипт.Параметры указаны ниже:

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я думаю, что ваше конкретное использование 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 <file_name> не разрешено, следует ли разрешить ./myscript.sh -f <file_name> -h -c?Необходимо изменить ответ на основе этого.

0 голосов
/ 17 мая 2018

Я использовал цикл 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

Есть ли лучший способ сделать те же проверки?

...