Я ищу оператор «in», который работает примерно так:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Это, очевидно, гораздо более короткое утверждение по сравнению, скажем, с использованием нескольких «или» тестов.
bash
shell-script
bourne-shell
mrjayviper
источник
источник
=~
недопустим в тесте с одиночными скобками POSIX[
- это POSIX, но[[
это расширенная функция bash, ksh (по-видимому, оттуда и zsh.case
example является наиболее POSIX из всех, хотяcase "$1" in
не нужно заключать в кавычки, ни разделение слов, ни расширение пути не выполняются в этом токене.В bash нет теста "in", но есть тест на регулярные выражения (не в bourne):
И обычно пишется с использованием переменной (меньше проблем с цитированием):
Для более старой оболочки Bourne вам нужно использовать совпадение регистра:
источник
Использование
case
хорошо и хорошо, если у вас есть фиксированный набор домашних животных, с которыми вы хотите сравниться. Но это не сработает, если вам нужно построить шаблон во время выполнения, так какcase
не интерпретирует изменение внутри расширенных параметров.Это будет соответствовать только литеральной строке
cat|dog|mouse
:Однако вы можете использовать переменную с совпадением регулярного выражения. Пока переменная не заключена в кавычки, любые операторы регулярных выражений в ней имеют свои особые значения.
Вы также можете использовать ассоциативные массивы. Проверка, существует ли ключ в одном из них, является самой близкой к
in
оператору, который дает Bash. Хотя синтаксис немного уродлив:(
${arr[$1]+x}
расширяется,x
еслиarr[$1]
установлено, в противном случае пусто. )источник
Вы можете использовать
case
оператор вif
тесте, но код будет выглядеть немного странно:или немного короче,
Это использует
case
предложение только для сопоставления с шаблоном дляif
предложения. Это вводит ненужный истинный / ложный тест.Лучше просто использовать
case
:Не делай этого:
или это:
... потому что вы просто добавляете более опасные слова, просто чтобы иметь возможность использовать
if
оператор в своем коде вместо совершенно разумногоcase
утверждения.источник
eval
изcase
заявления в этом случае, и это было бы еще более склонны к ошибкам."$1"|"$2"|"$3"
. Также unix.stackexchange.com/a/234415/85039 Но да, это немного волосато.grep
подходить.-q
чтобы избежать вывода на экран (быстрее, чем печатать>/dev/null
).-E
для расширенных(cat|dog|mouse)
аспектов регулярных выражений это необходимо.^(cat|dog|mouse)$
соответствует любым строкам, начинающимся с (^
), с кошкой, собакой или мышью ((cat|dog|mouse)
), за которыми следует конец строки ($
)источник