Как я могу проверить, равно ли значение аргумента, предоставленного из GETOPTS, указанному c строке? - PullRequest
0 голосов
/ 27 января 2020

Я пишу bash скрипт, который будет строить docker изображение локально или удаленно в зависимости от предоставленного аргумента.

Я борюсь с проверкой, равна ли предоставленная строка «удаленной» или «локальной».

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

!/bin/bash

usage() { echo "Usage: $0 [-m < local|remote>]" 1>&2; exit 1; }

while getopts "m:" o; do
    case "${o}" in
        m)
            destination=${OPTARG}
            ((destination == "local" || destination == "remote")) || usage
            ;;
        *)
            usage
            ;;
    esac
done
shift "$((OPTIND-1))"

echo $destination

1 Ответ

0 голосов
/ 27 января 2020

Таким образом, единственное изменение, которое вам нужно сделать, - это заменить оператор ((...)) на оператор [[ ... ]], как предложил @Nahuel Fouilleul, и добавить $ в переменные назначения. Однако их предложение не сработало для вас, потому что пункт назначения был написан неправильно. У меня есть обновленный код, показанный ниже.

#!/bin/bash

usage() { echo "Usage: $0 [-m < local|remote>]" 1>&2; exit 1; }

while getopts "m:" o; do
  case "${o}" in
    m)
        destination=${OPTARG}
        [[ $destination == "local" || $destination == "remote" ]] || usage
        ;;
    *)
        usage
        ;;
  esac
done

shift "$(( OPTIND-1 ))"

echo $destination

Однако вам не нужно проверять эту информацию в операторе switch, вы можете проверить основную часть своего кода и убедиться, что пункт назначения было установлено с использованием расширения параметров, как я показываю здесь:

...
    m)
        destination=${OPTARG}
        ;;
...

[[ ${destination:?A destination is required.} == "local" || ${destination} == "remote" ]] || usage

echo $destination
...