Bash: как искать следующий позиционный параметр в коде "case" без жесткого кодирования его значения? - PullRequest
1 голос
/ 19 февраля 2020

Учитывая фрагмент кода "case":

case $3 in 
        -a) 
            if [ "$4" == #some regex to match pattern ]; then
                #do some additional work
            else
                #proceed as usual
            fi
            ;;

Как мне лучше express Мое намерение искать позиционный параметр, который расположен в правой части текущей позиции справа? $ 3 (или $ 3 ++, если это имеет смысл) вместо жесткого кодирования его до $ 4 в операторе if?

EDIT:

простейшее использование моего сценария будет выглядеть как это:

./script.sh company region -a LIST-123

первые два обязательных позиционных аргумента (компания и регион) исправлены. Начиная с позиции $ 3, пользователи должны предоставить хотя бы один обязательный аргумент в формате предыдущего da sh и одну букву (-a, -b, - c et c). Однобуквенные обязательные аргументы могут иметь необязательный аргумент (LIST-123 в приведенном выше примере). Если необязательный аргумент не указан, сценарий должен возобновиться как обычно.

Я хочу, чтобы пользователи могли предоставлять несколько пар обязательных и необязательных аргументов. как это:

./script.sh company region -a LIST-123 -b LIST-456 -c LIST-789

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

./script.sh company region -c LIST-789 -b LIST-456 -a LIST-123

И иметь возможность предоставлять необязательные аргументы только для определенных обязательных однобуквенные аргументы, но не все:

. / script. sh регион компании - c LIST-789 -b -a LIST-123

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Вот пример использования shift.

#!/usr/bin/env bash

while (($#)); do
  case $1 in
    country) echo "$1" is given
      ;;
    region) echo "$1" is given
      ;;
    -a)
      printf 'Current first parameter is: %s\n' $1
      shift
      printf '%s %s\n' "Next to -a is" "$1";;
    -b)
      printf 'Current first parameter is: %s\n' $1
      shift
      printf '%s %s\n' "Next to -b is" "$1"
      ;;
    *)
      printf '%s\n' "Unknown option $1" >&2
      exit 1
  esac
  shift
done

Теперь запустите скрипт со следующими параметрами и аргументами.

./myscript country region -b bar -a foo

output

country is given
region is given
Current first parameter is: -b
Next to -b is bar
Current first parameter is: -a
Next to -a is foo
  • Я дал вам базовое решение, вам просто нужно адаптировать его к вашим потребностям.
  • Как я уже говорил, mandatory также может быть с опцией, поэтому независимо от того, где он заканчивается в аргументах (во-первых, середина, последняя) Может обрабатываться правильно.
2 голосов
/ 19 февраля 2020

shift это именно то, что вы ищете. См. help shift:

shift: shift [n]
Shift positional parameters.

Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
not given, it is assumed to be 1.

Exit Status:
Returns success unless N is negative or greater than $#.

Ваш (рабочий!) Код может выглядеть следующим образом:

#!/usr/bin/env bash

case $3 in
    -a)
    shift
        if [ "$3" == "word" ];
    then
        echo it matches
            #do some additional work
    else
        echo it does not match
            #proceed as usual
        fi
    ;;
esac

Вы также можете использовать eval, хотя не рекомендуется :

#!/usr/bin/env bash

case $3 in
    -a)
        if [ "$(eval echo \$$((3+1)))" == "word" ]; 
    then
        echo it matches
            #do some additional work
    else
        echo it does not match
            #proceed as usual
        fi
    ;;
esac
0 голосов
/ 19 февраля 2020

как это?

case $3:$4 in 
     -a:[a-z]*) echo ok ;;

Или

case $3:$4 in
     -a:[Tt]est) echo ok ;;
...