проверка, существует ли строка в массиве строк в bash - PullRequest
1 голос
/ 24 января 2020

Я знаю, как сравнить две строки в bash:

if [ "$build_type" = "devite" ]; then
  echo "building'"
fi

Но мне нужно проверить, находится ли "$ build_type" в ["devite", "relite"]

так что-то похожее на это:

if [ "$build_type" in ["devite", "relite"] ]; then
  echo "building'"
fi

Может кто-нибудь пролить свет на это?

Ответы [ 4 ]

4 голосов
/ 24 января 2020

Соедините две test / [ команды с помощью ||:

if [ "$build_type" = devite ] || [ "$build_type" = relite ]; then
  echo "building"
fi

или используйте оператор case.

case $build_type in
  devite|relite) echo "building" ;;
esac

Если цели находятся в Ассоциативный массив, вы можете проверить на наличие ключа.

declare -A targets=([devite]= [relite]=)

if [[ -v targets[$build_type] ]]; then
    echo "building"
fi
3 голосов
/ 24 января 2020

Зависит от того, как у вас целевые строки. Если они находятся в массиве (например, a=(devite relite), вы можете сделать:

if [[ "${a[@]}" =~ $build_type ]]; then ...
3 голосов
/ 24 января 2020

Я бы использовал case для этого, хм, регистр:

case "$build_type" in
  devite|relite)
    echo "building"
    ;;
esac

Символ трубы (|) указывает or logi c.

Конечно, с помощью встроенной оболочки case вы можете сделать гораздо больше, например, иметь несколько случаев с разным кодом обработки, но это проще всего прочитать для фиксированного списка фиксированных простых строк (со специальными символами в строках он может стать цитата из кошмара).

Если вы действительно хотите использовать массив списков, я бы использовал al oop:

names=( devite relite )
for name in "${names[@]}"
do
  if [ "$build_type" = "$name" ]
  then
    echo "building"
    break  # leave the loop
  fi
done
1 голос
/ 24 января 2020

Еще один вариант - использовать массивы и grep:

#!/bin/bash
declare -a types=("devite" "relite")
type=devite
neg=dovite

if grep -q "${type}" <<< "${types[*]}" ; then
        echo "building"
else
        echo "not building"
fi

if grep -q "${neg}" <<< "${types[*]}" ; then
        echo "building"
else
        echo "not building"
fi
=> building
   not building

Так много способов сделать скин для этой кошки:)

Редактировать: Если вы не можете доверять вводу быть действительным:

#!/bin/bash
declare -a types=("devite" "relite")
type=devite
neg="ite rel"

function j { local IFS=$'\n'; echo "$*"; }

if grep -q "${type}" <<< $(j "${types[@]}") ; then
        echo "building"
else
        echo "not building"
fi
if grep -q "${neg}" <<< $(j "${types[@]}") ; then
        echo "building"
else
        echo "not building"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...