проверить строку с каждым элементом массива - PullRequest
2 голосов
/ 28 октября 2011

Я новичок в написании сценариев оболочки bash, и я впервые и впервые задаю вопрос здесь в stackoverflow. Я уже искал архив безрезультатно. Я надеюсь, что кто-то может мне помочь.

У меня есть такой массив

declare -a SID=("mydb1" "mydb2" "mydb3")

В моем скрипте пользователю будет предложено ввести строку, и она будет сохранена в переменной $DBNAME.

Например, пользователь ввел «mydb2» (без кавычек), это будет сохранено в переменной $DBNAME.

Я хочу создать цикл и хочу, чтобы ввод пользователя был проверен по каждому элементу переменной ${SID[@]}.

И когда совпадение найдено, оно выходит из цикла и продолжает выполнение следующей команды в сценарии.

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

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 3 ]

5 голосов
/ 28 октября 2011

@ Подход Флимзи хорош. Правильный способ использовать цикл for

for db in "${SID[@]}"; do
  if [[ $db = $DBNAME ]]; then
    echo yes
    break
  fi
done
1 голос
/ 28 октября 2011

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

declare -a SID=("mydb1" "mydb2" "mydb3")
case " ${SID[*]} " in
    *\ $DBNAME\ *)
        echo Entered a correct DB name! Good job, pal!
        ;;
    *)
        echo Try again
        ;;
 esac

Это может привести к ложным срабатываниям в тех случаях, когда вы разрешаете ввод пространства пользователем с пробелами. Если это проблема, вы можете решить проблему, используя разделитель без пробела, который не разрешен при вводе пользователем. Например:

case ".mydb1.mydb2.mydb3." in
    *.$DBNAME.*)

Если ваш пользовательский ввод полностью открыт и не проверен, то цикл for, вероятно, будет лучшим выбором, как объяснено в ответе @ glennjackson.

0 голосов
/ 28 октября 2011

Если все, что вам нужно, это проверить, что $ DBNAME является записью $ SID, вероятно, проще всего сделать следующее:

if echo ${SID[@]} | grep -wq "$DBNAME"; then
   # DBNAME is in SID array
fi

Обратите внимание, что -w и -q являются нестандартнымиgrep, так что вы можете захотеть:

if echo ${SID[@]} | grep "\<$DBNAME\>" > /dev/null; then
   # DBNAME is in SID array
fi

Это не будет выполнено, если какие-либо записи в SID содержат пробелы, и другие нечетные символы, несомненно, также вызовут проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...