Я пытаюсь написать скрипт на bash, который проверяет правильность ввода пользователя.
Я хочу сопоставить вход (скажем, переменную x
) со списком допустимых значений.
что я придумал на данный момент:
for item in $list
do
if [ "$x" == "$item" ]; then
echo "In the list"
exit
fi
done
У меня вопрос: есть ли более простой способ сделать это,
что-то вроде a list.contains(x)
для большинства языков программирования?
Дополнение:
Скажите, что список:
list="11 22 33"
Мой код будет отображать сообщение только для этих значений, так list
как он обрабатывается как массив, а не как строка, все манипуляции со строками будут проверены, 1
пока я не захочу, чтобы он потерпел неудачу.
[[ $list =~ (^| )$x($| ) ]] && echo 'yes' || echo 'no'
x=.
contains () { [[ "$1" =~ (^|[[:space:]])"$2"($|[[:space:]]) ]]; }
.[[ " $list " =~ " $x " ]] && echo 'yes' || echo 'no'
. это правильно, если предположить, что пробел является разделителем и$x
не содержит пробелаisIn()
чтобы вы могли сначала написать элемент в параметрах. Также вы можете использоватьecho
что-то вместоexit
этого:[[ $2 =~ (^|[[:space:]])$1($|[[:space:]]) ]] && echo 1 || echo 0
Таким образом, вы можете использовать эту функцию следующим образом:result=$(isIn "-t" "-o -t 45") && echo $result
Матвей прав, но вы должны заключить в кавычки $ x и рассмотреть любые «пробелы» (например, новую строку) с
так что
конец тогда
или
Обратите внимание, что вы должны использовать
""
в случае переменных:источник
$item
содержит специальные символы, например.
(но$list
переменная, вероятно, должна быть заключена в кавычки внутри теста). А функция может быть определена еще проще:contains () { [[ "$1" =~ (^|[[:space:]])"$2"($|[[:space:]]) ]]; }
.list="aa bb xx cc ff"
иx="aa bb"
$list =~ (^|[[:space:]])"$item"($|[[:space:]])
. Или, если у вас есть время, я был бы рад услышать ваше объяснение этого выражения. Примечание: я предполагаю, что это выражение регулярного выражения (начинается с ^ и т. Д.), Но я не знаю, что означает = ~. Так что я хотел бы общее объяснение: PИМХО самое простое решение - добавить и добавить исходную строку с пробелом и проверить регулярное выражение с помощью
[[ ]]
это не будет ложно положительным для значений со значениями, содержащими иглу в качестве подстроки, например со стогом сена
foo barbaz
.(Концепция бесстыдно похищена из
hasClass()
JQuery's-метода)источник
haystack="foo:bar"
и[[ ":$haystack:" = *:$needle:* ]]
как насчет
Вы можете проверить вывод или
$?
вышеприведенную строку, чтобы принять решение.grep -w
проверяет целые шаблоны слов.источник
Вы также можете использовать (* подстановочные знаки) вне оператора case, если вы используете двойные скобки:
источник
*My*
) должны быть в правой части теста.Если ваш список значений должен быть жестко запрограммирован в скрипте, его довольно просто протестировать
case
. Вот краткий пример, который вы можете адаптировать к вашим требованиям:Если список является переменной массива во время выполнения, возможно, лучше подойдет один из других ответов.
источник
Если список исправлен в скрипте, мне больше всего нравится следующее:
Затем используйте
validate "$x"
для проверки, если$x
это разрешено.Если вы хотите использовать одну строку и вам не нужны пробелы в именах элементов, вы можете использовать это (обратите внимание,
-w
вместо-x
):Ноты:
sh
совместимый.validate
вовсе не принимает подстроки (удалить-x
опцию Grep , если вы хотите , что).validate
интерпретирует его аргумент как фиксированную строку, а не как регулярное выражение (-F
если хотите, удалите опцию для grep).Пример кода для осуществления функции:
источник
Рассмотрим использование ключей ассоциативных массивов . Я бы предположил, что это превосходит как регулярное выражение / сопоставление с образцом, так и циклы, хотя я не профилировал это.
Вывод:
источник
echo -n
) с творческим использованием параметров:do is="${list[$value]+is }"; echo "$value ${is:-is *not* }a member of ( ${!list[*]} )"; done
.Я считаю, что проще использовать форму,
echo $LIST | xargs -n1 echo | grep $VALUE
как показано ниже:Это работает для списка, разделенного пробелами, но вы можете адаптировать его к любому другому разделителю (например
:
), выполнив следующее:Обратите внимание, что
"
для работы теста требуется.источник
LIST="SOMEITEM1 ITEM2"
возвращать истину, даже еслиITEM1
ее нетДумал, я бы добавил свое решение в список.
источник
Примеры
in_list
источник
Предполагая, что переменная TARGET может быть только 'биномиальной' или 'регрессией', тогда будет сделано следующее:
Вы можете добавить больше строк в список, разделив их символом | (труба) персонажа.
Преимущество использования egrep заключается в том, что вы можете легко добавить нечувствительность к регистру (-i) или проверить более сложные сценарии с помощью регулярного выражения.
источник
Это почти ваше оригинальное предложение, но почти 1-лайнер. Не так сложно, как другие правильные ответы, и не так, в зависимости от версий bash (может работать со старыми bash).
Я предполагаю, что мое предложение еще можно улучшить, как по длине, так и по стилю.
источник
Если это не слишком долго; Вы можете просто связать их между равенствами в логическом ИЛИ-сравнении, например.
У меня была именно эта проблема, и, хотя вышесказанное выглядит ужасно, происходящее более очевидно, чем другие обобщенные решения.
источник