Проверьте, соответствуют ли какие-либо параметры скрипта bash строке

Я пытаюсь написать сценарий, в котором я хочу проверить, соответствует ли какой-либо из параметров, переданных сценарию bash, строке. Как у меня настройки сейчас

if [ "" != "-disCopperBld" -a "" != "-disCopperBld" -a "" != "-disCopperBld" -a "" != "-disCopperBld"]

но может быть большое количество параметров, поэтому мне было интересно, есть ли лучший способ сделать это?

спасибо

изменить:
Я попробовал этот кусок кода и вызвал скрипт с опцией-disableVenusBld, но он все равно печатает "Starting build". Я что-то делаю не так? Заранее спасибо!

while [ $# -ne 0 ]
do
    arg=""
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi
5
задан iman453
источник

4 ответов

похоже, вы выполняете обработку опций в сценарии оболочки. Вот идиома для этого:

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option "
            ;;
        *) echo "argument "
            ;;
    esac
    shift
done

exit 0

(есть несколько конвенций для отступа ;;, а некоторые оболочки позволяют задавать параметры как (--opt1), чтобы помочь с соответствием скобки, но это основная идея)

50
отвечен Norman Gray 2010-09-08 19:48:17
источник

это работает для меня. Он делает именно то, что вы больше ничего не просили (без обработки опций). Хорошо это или плохо-упражнение для плаката:)

if [[ "$@" == "your string" ]]
then
    echo "YES"
else
    echo "NO"
fi

обратите внимание, что использование $@, вместо $*, вместе с тем, что он заключен в кавычки, гарантирует гибкость в случае тестовой строки с whitespeces. С $* только "your" или "string" будут подобраны. Бы никакой разницы, если нет пробелов.

посмотреть данное объяснение о различиях в поведении.

16
отвечен Rich Homolka 2015-02-01 14:24:38
источник

Как насчет поиска (с подстановочными знаками) всего пространства параметров:

if [[ $@ == *'-disableVenusBld'* ]]
then

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

if [[ "${@#-disableVenusBld}" = "$@" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

Edit2: Хорошо, хорошо, может быть, это не идеально... Думаю, что это работает, только если -param находится в начале списка, а также будет соответствовать -paramXZY или-paramABC. Я все еще думаю, что оригинальная проблема может быть решена очень хорошо с помощью манипуляции строкой bash, но я не совсем ее взломал... -Мочь ты??

8
отвечен Rich 2018-06-25 14:31:26
источник
disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

Если вам нужно проверить только параметры, начиная с выполните поиск в функции:

## Usage: search_trailing_parameters NEEDLE NUM "$@"
## Search NEEDLE amongst the parameters, skipping  through ${$NUM}.
search_trailing_parameters () {
  needle=
  shift $(( + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "$@"; then
  ...
fi

но мне интересно, почему вы пытаетесь сделать это в первую очередь, это не общая потребность. Как правило, вы бы процесс опции в порядке, как в ответе Денниса на ваш предыдущий вопрос.

1
отвечен Gilles 2017-03-20 10:16:51
источник

Другие вопросы bash linux shell-script unix