Как проверить, существует ли переменная в списке в BASH - PullRequest
113 голосов
/ 09 ноября 2011

Я пытаюсь написать скрипт на bash, который проверяет правильность ввода пользователя.
Я хочу сопоставить ввод (скажем, переменную x) со списком допустимых значений.

На данный момент я пришел к выводу:

for item in $list
do
    if [ "$x" == "$item" ]; then
        echo "In the list"
        exit
    fi
done

Мой вопрос: есть ли более простой способ сделать это,
что-то вроде list.contains(x) для большинства языков программирования.

Добавление:
Скажите, что список:

list="11 22 33"

мой код будет отображать сообщение только для этих значений, поскольку list обрабатывается как массив, а не строкавсе манипуляции со строками будут проверять 1, в то время как я хотел бы, чтобы он потерпел неудачу.

Ответы [ 13 ]

1 голос
/ 27 апреля 2018

Если предположить, что переменная TARGET может быть только 'биномиальной' или 'регрессией', тогда будет сделано следующее:

# Check for modeling types known to this script
if [ $( echo "${TARGET}" | egrep -c "^(binomial|regression)$" ) -eq 0 ]; then
    echo "This scoring program can only handle 'binomial' and 'regression' methods now." >&2
    usage
fi

Вы можете добавить больше строк в список, разделив их символом |(труба).

Преимущество использования egrep заключается в том, что вы можете легко добавить нечувствительность к регистру (-i) или проверить более сложные сценарии с помощью регулярного выражения.

1 голос
/ 11 апреля 2016

Примеры

$ in_list super test me out
NO

$ in_list "super dude" test me out
NO

$ in_list "super dude" test me "super dude"
YES

# How to use in another script
if [ $(in_list $1 OPTION1 OPTION2) == "NO" ]
then
  echo "UNKNOWN type for param 1: Should be OPTION1 or OPTION2"
  exit;
fi

in_list

function show_help()
{
  IT=$(CAT <<EOF

  usage: SEARCH_FOR {ITEM1} {ITEM2} {ITEM3} ...

  e.g. 

  a b c d                    -> NO
  a b a d                    -> YES
  "test me" how "test me"    -> YES

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi

if [ "$#" -eq 0 ]; then
  show_help
fi

SEARCH_FOR=$1
shift;

for ITEM in "$@"
do
  if [ "$SEARCH_FOR" == "$ITEM" ]
  then
    echo "YES"
    exit;
  fi
done

echo "NO"
0 голосов
/ 09 ноября 2018

Думаю, я добавлю свое решение в список.

# Checks if element "$1" is in array "$2"
# @NOTE:
#   Be sure that array is passed in the form:
#       "${ARR[@]}"
elementIn () {
    # shopt -s nocasematch # Can be useful to disable case-matching
    local e
    for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
    return 1
}

# Usage:
list=(11 22 33)
item=22

if elementIn "$item" "${list[@]}"; then
    echo TRUE;
else
    echo FALSE
fi
# TRUE

item=44
elementIn $item "${list[@]}" && echo TRUE || echo FALSE
# FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...