Skript zum Überprüfen der Softwareversion

Hallo, ich versuche, ein Skript zu schreiben, um die Softwareversion zu überprüfen. Ich möchte meine eigenen Variablen übergeben, die Name der Anwendung und Version sind.

Hier ist eine Kopie. Es funktioniert derzeit nicht für mich ... ich bin ein Noob und ich bin mir ziemlich sicher, dass es mit der Syntax zu tun hat.

Jede Eingabe wird geschätzt.

Danke, Paul

#/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

Antworten (2)

Es gibt wirklich nur einen Syntaxfehler, den Sie gemacht haben. Sie setzen ein Leerzeichen vor Zahl in $ApplicationVersionNumber. Die meisten Apps haben keine version.plist-Datei, aber sie haben immer die Version in ihrer Info.plist.

Hier ist eine korrigierte Version des Skripts mit einigen Verbesserungen:

#!/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
  • Es verwendet plutil -panstelle von cat, da plutil eine schöne, lesbare Version der plist ausdrucken kann, auch wenn sie nicht im XML-Format vorliegt.
  • Es sucht nach dem Schlüssel (CFBundleShortVersionString), .*und dann nach dem Wert. Dies ist besser, weil Sie nicht möchten, dass es bei Dingen wie ausgelöst wird LSMinimumSystemVersion.
  • Ich habe auch mehr Anführungszeichen hinzugefügt, weil ich Anführungszeichen mag und die Dinge (normalerweise) weniger wahrscheinlich auf diese Weise kaputt gehen.

Ich hätte es so geschrieben:

#!/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

Der Vorteil davon ist, dass die tatsächliche Versionszeichenfolge überprüft wird. Wenn Sie also 1.3 eingeben und es 1.3.1 ist, wird gemeldet, dass es sich um eine andere Version handelt. $1und $2sind die Kommandozeilenargumente, die wie übergeben werden./script.sh '/Applications/FakeApp.app' '1.3'

.Außerdem würde der andere auf 1.1 für 121 als korrekt gelten, da grep den als Platzhalter zählt .

Danke für deine Zeit und deinen Input. Vor allem die Erklärung. Ich habe jetzt ein besseres Verständnis dafür.
Die einzige Ergänzung, die ich vorschlagen würde, ist, auch nach CFBundleVersion zu suchen, wenn Sie CFBundleShortVersionString nicht finden
@TJLuoma Das Problem dabei ist, dass es bei der falschen Version ausgelöst werden könnte . CFBundleVersion wird hauptsächlich für Build-Nummer IIRC verwendet, daher würde es ein ähnliches Problem geben. (Ich bezweifle, dass Firefox 2714.2.12 erreichen wird, aber ...) Ich denke auch, dass der CFBundleShortVersionString-Schlüssel obligatorisch ist, zumindest wenn Sie mit Xcode bauen.
CFBundleShortVersionString ist definitiv die bevorzugte zu verwenden. Ich habe jedoch auch einige Apps gesehen, die kein CFBundleShortVersionString haben und CFBundleVersion haben. Wenn Sie CFBundleShortVersionString also nicht finden, würde ich nach CFBundleVersion suchen, es aber ansonsten ignorieren.
@TJLuoma Hinzugefügt.

Sie können auch AppleScript oder verwenden defaults:

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

Sie können AppleScript oder verwenden, mdfindum den Pfad einer Anwendung zu finden:

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