Проверка Bash и условные заявления - PullRequest
3 голосов
/ 24 мая 2011

Я нахожусь в процессе написания сценария установки для программы на bash. Первая часть установки определяет, установлена ​​ли программа уже или нет. Это обнаруживается по наличию файла в указанном каталоге. Эта часть отлично работает. Однако я хочу, чтобы пользователь мог обновиться до новой версии, если старая версия существует. Я думал, что у меня был правильный код, но он не совсем работает. В / var / www / html / gvsms есть файл с именем .version, в котором просто есть версия программы. Я хочу сравнить это число с номером установщика. Я не уверен, как, однако, внутри утверждения if. Может ли быть несколько If внутри If? Это то, что я до сих пор:

$installerver=1.1
$installedver=${cat /var/www/html/gvsms/.version}
echo "Installation beginning...."
echo " "
echo " "
echo -n "Checking to see if GVoice SMS Notification System was previously installed..."
if [ -a /var/www/html/gvsms/index.php ]; then 
   echo "Yes."
   echo ""
   echo "I have detected a previous installation of GVoice SMS Notification System."
   if [ $installerver == $installedver ]; then
       echo "The GVoice SMS Notification System is currently installed and is the same version as this installer. If you were trying to upgrade, please check the installer you downloaded and try again."
       exit
   fi
   elif [ $installedver == "0.5" || $installedver == "1.0"]; then
   while [[ "$yn" != "Yes" && "$yn" != "Y" && "$yn" != "y" && "$yn" != "yes" ]]; do
      echo "Would you like to upgrade? Yes or no."
      read -r  upgrade
      echo "$upgrade upgrade?"
      echo "Is this correct? (Yes or No)"
      read yn
   done
   echo "Upgrade proceeding..."
   fi
echo "No."
echo "I have not detected a previous installation of GVoice SMS Notification System."
read -p "To proceed with installation at your own risk, press Enter. Otherwise Ctrl-C."

В настоящее время ошибки программы:

./test.x: line 1: =1.1: command not found
./test.x: line 2: ${cat /var/www/html/gvsms/.version}: bad substitution

Способ работы программы заключается в том, что если файл обнаружен, установленная версия не совпадает (или меньше) с установщиком, и пользователь говорит «да» для обновления, команды обновления должны выполняться. Если пользователь говорит «нет» для обновления, выйдите из сценария.

Если программа установлена ​​и имеет ту же версию, что и установщик, отобразить сообщение об ошибке и выйти.

Если программа еще не установлена, пропустите повторную установку и продолжите обычную установку.

Возможно ли это? Спасибо!

Ответы [ 2 ]

3 голосов
/ 24 мая 2011
  1. Добавьте строку shebang в начало сценария:

    #!/bin/bash
    
  2. Переменная присваивается без знака доллара:

    installerver=1.1
    
  3. При назначении переменной из команды subshell используются круглые скобки, а не фигурные скобки:

    installedver=$(cat /var/www/html/gvsms/.version)
    
  4. В вашем блоке if есть плохой fi

  5. Вам не хватает else блока
  6. Вам, вероятно, следует проверить, существует ли файл, прежде чем его искать.
  7. Вы должны заключить в кавычки все свои переменные
  8. Вам нужны пробелы в условных скобках [ … ] и [[ … ]]

Ваш код будет запущен:

#!/bin/bash

installerver="1.1"
echo "Installation beginning...."
echo " "
echo " "
echo -n "Checking to see if GVoice SMS Notification System was previously installed..."
if [ -e "/var/www/html/gvsms/index.php" -a -r "/var/www/html/gvsms/.version" ]; then
   echo "Yes."
   echo ""
   echo "I have detected a previous installation of GVoice SMS Notification System."
   if [ "$(cat /var/www/html/gvsms/.version)" == "$installedver" ]; then
       echo "The GVoice SMS Notification System is currently installed and is the same version as this installer. If you were trying to upgrade, please check the installer you downloaded and try again."
       exit
   elif [ "$installedver" == "0.5" || "$installedver" == "1.0" ]; then
       while [[ "$yn" != "Yes" && "$yn" != "Y" && "$yn" != "y" && "$yn" != "yes" ]]; do
          echo "Would you like to upgrade? Yes or no."
          read -r  upgrade
          echo "$upgrade upgrade?"
          echo "Is this correct? (Yes or No)"
          read yn
       done
       echo "Upgrade proceeding..."
   fi
else
    echo "No."
    echo "I have not detected a previous installation of GVoice SMS Notification System."
    read -p "To proceed with installation at your own risk, press Enter. Otherwise Ctrl-C."
fi
0 голосов
/ 24 мая 2011

Ваши назначения имеют синтаксические ошибки. При присвоении переменной вы не ставите знак доллара $. А для подстановки команд используйте круглые скобки $(...).

installerver=1.1
installedver=$(cat /var/www/html/gvsms/.version)

Фигурные скобки предназначены для простой замены переменных, как в echo "You bought $qty ${item}s.".

...