Оболочка, как проверить, присутствует ли элемент в списке и повлияет ли на результат в переменной - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть сценарий оболочки:

#!/bin/bash
server=$1
modules=$2  #example of modules = moduleOne,moduleTwo,moduleThree   

is_selected=$( if [[ $modules == *"moduleThree"* ]]; then echo true; else echo false; fi)

Я хочу, чтобы, если " moduleThree " присутствовало в списке $ модулей, которые могут измениться:

примеры:

modules = moduleOne,moduleTwo,moduleThree   
modules = moduleOne,moduleThree,moduleFour
modules = moduleOne

Таким образом, я всегда получаю результат как false

Как я могу исправить это?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

Вы, кажется, на самом деле не используете bash, поэтому вам нужно придерживаться POSIX-совместимых конструкций.

case $2 in
  moduleThree,*|,moduleThree,|*,moduleThree) is_selected=true ;;
  *) is_selected=false
esac
0 голосов
/ 25 февраля 2020

Попробуйте использовать bash регулярное выражение с =~

#!/bin/bash
server=$1
modules=$2  #example of modules = moduleOne,moduleTwo,moduleThree

re='.*moduleThree.*'
[[ $modules =~ $re ]] && is_selected='true' || is_selected='false'
echo $is_selected

Использование

$ ./test srv moduleOne,moduleTwo
false

$ ./test srv moduleOne,moduleThree,moduleTwo
true
0 голосов
/ 24 февраля 2020

Если у вас есть строка, разделенная запятыми, используйте ее для заполнения массива, а затем отсканируйте массив для поиска правильного модуля.

IFS=, read -a module_list <<< "$2"

is_selected=false; for mod in "${module_list[@]}"; do [[ $mod = moduleThree ]] && is_selected=true; done

Если вы планируете проверить список для нескольких модулей, будет имеет смысл создать ассоциативный массив из module_list, чтобы вы могли выполнять поиск в постоянное время:

declare -A mod_array
for mod in "${module_list[@]}"; do
  mod_array[$mod]=
done

mod_three_selected=false; [[ -v mod_array[moduleThree] ]] && mod_three_selected=true

Если вам не нужно значение mod_three_selected для чего-то вроде файла конфигурации, это будет проще просто использовать ваш массив напрямую:

if [[ -v mod_array[moduleThree] ]]; then
    ....
fi

, а не

if [[ mod_three_selected = true ]]; then
    ....
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...