Возврат функции Bash, похоже, не работает должным образом

У меня есть функция is_mysql_db(), чтобы определить, является ли установленная база данных на сервере сервером mysql. Поэтому в идеале код в основном теле должен вызывать функцию, чтобы определить, следует ли считать этот сервер сервером mysql или нет.

Пробовал в конце функции ставить двойные скобки, одинарное "=", использовать или не использовать переменную для сравнения. У меня, честно говоря, нет идей, и я хотел бы, чтобы этот код выглядел как можно более понятным, так как это лишь небольшая его часть.

Ниже моего примера кода:

#!/bin/bash

is_mysql_db(){
    yum_mysql_out=$(yum list installed | grep mysql-community | awk '{ print $1 }' | tail -n1)
    [ $yum_mysql_out == "mysql-community-server.x86_64" ]
}


if [ is_mysql_db ]
then
        echo "Installed"
else
        echo "Not Installed"
fi

Я ожидаю, что если установлен пакет MySQL yum, он обнаружит его и вернет, что пакет установлен, и если он не вернет Not Installed. Простой, но не очень, видимо.

Вам нужно удалить скобки в if. if command; then ... выполнит блок then, если команда завершается с 0. [...] полезен, когда вам нужно использовать такие операторы, как =/==, которые вы используете в функции.

Aaron 27.05.2019 16:33

И похоже, что вы могли бы упростить все это как if yum list installed | grep "mysql-community-server.x86_64"; then echo Installed; else echo "Not Installed"; fi

Aaron 27.05.2019 16:35
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Неправильная не функция оболочки, а ваш вызов.

Помещение строки в квадратные скобки не запускает эту команду, а просто проверяет, не пуста ли сама строка.

Не помещайте функцию в квадратные скобки, и она будет выполняться как команда.

Пример:

$ if [ false ] ; then echo "false is true??"; else echo "false is false as expected" ; fi

false is true??

$ if false ; then echo "false is true??"; else echo "false is false as expected" ; fi

false is false as expected

Кстати, ваша функция может быть проще:

is_mysql_db(){
    yum list installed | grep -q mysql-community-server
}

Или даже использовать rpm напрямую, чтобы yum не перезагружал свои индексы пакетов:

is_mysql_db(){
    rpm --quiet -q mysql-community-server
}

Действительно, я удаляю скобки при вызове функции и теперь отлично работаю, спасибо!

Gaita 27.05.2019 16:38

Я обновил ваше предложение, используя ваш rpm, и он отлично работает. Спасибо еще раз.

Gaita 27.05.2019 16:46

Круто, так должно быть немного быстрее.

Bill Karwin 27.05.2019 16:53

Другие вопросы по теме