Bash строка сравнивается с несколькими правильными значениями
у меня есть следующий кусок bashscript:
function get_cms {
echo "input cms name"
read cms
cms=${cms,,}
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
get_cms
fi
}
Но независимо от того, что я ввожу (правильные и неправильные значения), он никогда больше не вызывает функцию, потому что я хочу разрешить только один из этих трех входов. Я попробовал это с || с [ var != value ] or [ var != value1 ] or [ var != value1 ]
но ничего не работает. Может ли кто-нибудь указать мне правильное направление?
Ответы
Ответ 1
Вместо того, чтобы говорить:
if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
говорят:
if [[ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]]; then
Вы также можете обратиться к Условные конструкции.
Ответ 2
Если основное намерение состоит в том, чтобы проверить, не указано ли входящее значение в списке, возможно, вы можете использовать расширенное соответствие регулярных выражений, встроенное в BASH, с помощью оператора "equal tilde" (см. также этот ответ):
if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi
Хороший день
Ответ 3
Возможно, вам лучше использовать case
для таких списков:
case "$cms" in
wordpress|meganto|typo3)
do_your_else_case
;;
*)
do_your_then_case
;;
esac
Я думаю, что надолго такие списки лучше читаемы.
Если вы все еще предпочитаете if
, вы можете сделать это с помощью отдельных скобок двумя способами:
if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then
или
if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then
Ответ 4
Здесь мое решение
if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then