Скрипт для проверки версии ПО

Привет, я пытаюсь написать скрипт для проверки версии программного обеспечения. Я хочу передать свои собственные переменные, которые являются именем приложения и версии.

Вот копия. В настоящее время у меня это не работает ... я нуб, и я почти уверен, что это связано с синтаксисом.

Любой вклад приветствуется.

Спасибо, Пол.

#/bin/sh

#Enter the Name of the Application here
ApplicationName=/Applications/FakeApp.app
ApplicationVersionNumber=1.0
echo $ApplicationName

#Check if Directory Exist
if [ ! -d $ApplicationName ]; then
            echo $ApplicationName "is not installed"
            exit 123456
fi
echo $ApplicationName " is installed"

# Check Version
VersionCheck=`cat $ApplicationName/version.plist | grep $ApplicationVersionNumber`
echo $VersionCheck
if [ ${#VersionCheck} != 0 ]; then
echo $VersionCheck
echo $ApplicationName $ApplicationVersion Number "is Installed"
exit 0
fi
echo $ApplicationName $ApplicationVersion Number "is NOT Installed"

exit 1

Ответы (2)

На самом деле вы допустили только одну синтаксическую ошибку. Вы ставите пробел перед числом в $ApplicationVersionNumber. У большинства приложений нет файла version.plist, но у них всегда есть версия в их Info.plist.

Вот исправленная версия скрипта с некоторыми улучшениями:

#!/bin/sh

ApplicationName=/Applications/FakeApp.app
ApplicationVersionNumber=1.0
echo $ApplicationName

#Check if Directory Exist
if [ ! -d $ApplicationName ]; then
    echo "$ApplicationName is not installed"
    exit 123456
fi
echo "$ApplicationName is installed"

# Check Version
VersionCheck=`plutil -p "${ApplicationName}/Contents/Info.plist" | grep "CFBundleShortVersionString.*$ApplicationVersionNumber"`
echo $VersionCheck
if [ ${#VersionCheck} != 0 ]; then
    echo "$ApplicationName $ApplicationVersionNumber is Installed"
    exit 0
fi
echo "$ApplicationName $ApplicationVersionNumber is NOT Installed"
exit 1
  • Он использует plutil -pвместо cat, так как plutil может распечатать красивую, удобочитаемую версию plist, даже если она не в форме XML.
  • Он ищет ключ (CFBundleShortVersionString), .*а затем значение. Это лучше, потому что вы не хотите, чтобы он срабатывал на таких вещах, как LSMinimumSystemVersion.
  • Я также добавил больше кавычек, потому что мне нравятся кавычки, и (обычно) с меньшей вероятностью они сломаются.

Я бы написал так:

#!/bin/bash
app_path="$1"
desired_version="$2"

#Get the line, regardless of whether it is correct
version_line=$(plutil -p "${app_path}/Contents/Info.plist" | grep "CFBundleShortVersionString")
if [[ $? -ne 0 ]]; then
    version_line=$(plutil -p "${app_path}/Contents/Info.plist" | grep "CFBundleVersion")
    if [[ $? -ne 0 ]]; then #if it failed again, the app is not installed at that path
        echo "$app_path not installed at all"
        exit 123456
    fi
fi
#Some text editing to get the real version number
real_version=$(echo $version_line | grep -o '"[[:digit:].]*"' | sed 's/"//g')
if [ "$real_version" = "$desired_version" ]; then
    echo "$app_path $desired_version is installed"
    exit 0
fi
echo "${app_path}'s version is $real_version, not $desired_version"
exit 1

Преимущество этого в том, что он проверяет фактическую строку версии, поэтому, если вы поместите 1.3, а это 1.3.1, он сообщит, что это другая версия. $1и $2являются аргументами командной строки, которые передаются как./script.sh '/Applications/FakeApp.app' '1.3'

Кроме того, другой будет считаться правильным для 1.1 для 121, потому что grep считает .подстановочным знаком.

Спасибо за ваше время и вклад. Особенно объяснение. Теперь я лучше это понимаю.
Единственное дополнение, которое я бы предложил, - это проверить также CFBundleVersion, если вы не найдете CFBundleShortVersionString.
@TJLuoma Проблема в том, что это может сработать на неправильной версии. CFBundleVersion используется в основном для номера сборки IIRC, поэтому у него будет аналогичная проблема. (Я сомневаюсь, что Firefox доберется до 2714.2.12, но...) Также я думаю, что ключ CFBundleShortVersionString является обязательным, по крайней мере, при сборке с помощью Xcode.
CFBundleShortVersionString абсолютно определенно является предпочтительным для использования. Однако я также видел некоторые приложения, которые не имеют CFBundleShortVersionString, но имеют CFBundleVersion, поэтому, если вы не найдете CFBundleShortVersionString, я буду искать CFBundleVersion, но в противном случае проигнорирую его.
@TJLuoma Добавлено.

Вы также можете использовать AppleScript или defaults:

$ osascript -e 'version of app "TextEdit"'
1.9
$ defaults read /Applications/TextEdit.app/Contents/Info.plist CFBundleShortVersionString
1.9

Вы можете использовать AppleScript или mdfindнайти путь к приложению:

$ osascript -e 'posix path of (path to app "textedit")'
/Applications/TextEdit.app/
$ mdfind 'kMDItemContentType=com.apple.application-bundle&&kMDItemFSName=TextEdit.app'
/Applications/TextEdit.app