Yazılım Sürümü'nü kontrol etmek için komut dosyası


2

Merhaba, yazılım sürümünü kontrol etmek için bir senaryo yazmaya çalışıyorum. Uygulama ve Sürüm adı olan kendi değişkenlerimi iletmek istiyorum.

İşte bir kopyası. Şu anda benim için çalışmıyor ... ben bir noob ve sözdizimi ile ilgili olduğundan eminim.

Herhangi bir giriş takdir edilmektedir.

Teşekkürler 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

Yanıtlar:


6

Yaptığın tek bir sözdizimi hatası var. Sayı girmeden önce bir boşluk bıraktın $ApplicationVersionNumber. Çoğu uygulama bir version.plist dosyasına sahip değildir, ancak her zaman kendi Info.plist'lerinde sürüm bulunur.

İşte betiğin sabit bir sürümü, birkaç iyileştirme ile:

#!/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
  • Bunun plutil -pyerine kullanır cat, çünkü plutil, plistin güzel ve okunabilir bir versiyonunu XML biçiminde olmasa bile yazdırabilir.
  • Anahtar (CFBundleShortVersionString) .*ve sonra değeri için greps . Bu daha iyi çünkü onun gibi şeyleri tetiklemesini istemiyorsunuz LSMinimumSystemVersion.
  • Daha fazla tırnak ekledim çünkü alıntıları severim ve işlerin (genellikle) bu şekilde kırılma olasılığı daha düşüktür.

Böyle yazmış olurdum:

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

Bunun avantajı, gerçek sürüm dizesini kontrol etmesidir, bu nedenle 1.3 ve 1.3.1 koyarsanız, farklı bir sürüm olduğunu bildirir. $1ve $2gibi iletilen komut satırı argümanları./script.sh '/Applications/FakeApp.app' '1.3'

Ayrıca, diğeri 121 için 1.1 değerinde doğru sayılır çünkü grep .joker karakter olarak sayılır .


Zaman ayırdığınız ve girdiğiniz için teşekkür ederiz. Özellikle de açıklama. Şimdi daha iyi anlıyorum.
Paul Mung

Önereceğim tek şey CFBundleShortVersionString
TJ Luoma

Bununla bela @TJLuoma öyle olabilir yanlış sürümüne tetikler. CFBundleVersion temel olarak IIRC yapı numarası için kullanılır, böylece benzer bir problemi olur. (Firefox’un 2714.2.12’ye ulaşacağından şüpheliyim ama ...) Ayrıca CFBundleShortVersionString anahtarının zorunlu olduğunu düşünüyorum, en azından Xcode ile kurduğunuzda.
0942v8653

CFBundleShortVersionString kesinlikle kullanmak için tercih edilenidir. Ancak, CFBundleShortVersionString ve CFBundleVersion olmayan bazı uygulamalar da gördüm, bu yüzden CFBundleShortVersionString'i bulamazsanız CFBundleVersion'u arayacağım ama başka türlü görmezden geleceğim.
TJ Luoma

@TJLuoma Eklendi.
0942v8653

2

Ayrıca AppleScript veya defaults:

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

AppleScript'i kullanabilir veya mdfindbir uygulamanın yolunu bulmak için kullanabilirsiniz :

$ osascript -e 'posix path of (path to app "textedit")'
/Applications/TextEdit.app/
$ mdfind 'kMDItemContentType=com.apple.application-bundle&&kMDItemFSName=TextEdit.app'
/Applications/TextEdit.app
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.