สคริปต์เพื่อตรวจสอบเวอร์ชั่นของซอฟต์แวร์


2

สวัสดีฉันพยายามเขียนสคริปต์เพื่อตรวจสอบเวอร์ชั่นซอฟต์แวร์ ฉันต้องการส่งตัวแปรของตัวเองซึ่งเป็นชื่อของแอปพลิเคชันและเวอร์ชั่น

นี่คือสำเนา มันไม่ทำงานสำหรับฉันในขณะนี้ ... ฉันเป็น noob และฉันค่อนข้างแน่ใจว่ามันเกี่ยวข้องกับไวยากรณ์

ข้อมูลใด ๆ ที่ชื่นชม

ขอบคุณพอล

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

คำตอบ:


6

มีข้อผิดพลาดทางไวยากรณ์เพียงข้อเดียวที่คุณทำ $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เนื่องจากพลูติลสามารถพิมพ์เพลทิสต์ที่ดีและอ่านได้แม้ว่ามันจะไม่ได้อยู่ในรูปแบบ XML
  • มัน greps สำหรับคีย์ (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 นับ.ว่าเป็น wildcard


ขอบคุณสำหรับเวลาและการป้อนข้อมูลของคุณ โดยเฉพาะคำอธิบาย ตอนนี้ฉันมีความเข้าใจที่ดีขึ้นแล้ว
Paul Mung

CFBundleVersion ถ้าคุณไม่พบ CFBundleShortVersionString
TJ Luoma

@TJLuoma ปัญหาที่เกิดขึ้นกับมันคือมันอาจทำให้เกิดการผิดรุ่น CFBundleVersion ใช้เป็นหลักในการสร้างหมายเลข IIRC ดังนั้นมันจะมีปัญหาที่คล้ายกัน (ฉันสงสัยว่า Firefox จะเพิ่มขึ้นเป็น 2714.2.12 แต่ ... ) นอกจากนี้ฉันคิดว่าคีย์ CFBundleShortVersionString มีผลบังคับใช้อย่างน้อยเมื่อคุณสร้างด้วย Xcode
0942v8653

CFBundleShortVersionString เป็นสิ่งที่ต้องการใช้อย่างแน่นอน อย่างไรก็ตามฉันได้เห็นแอพบางตัวที่ไม่มี CFBundleShortVersionString และมี CFBundleVersion ดังนั้นหากคุณไม่พบ CFBundleShortVersionString ฉันจะมองหา CFBundleVersion แต่ไม่เช่นนั้น
TJ Luoma

@TJLuoma เพิ่มแล้ว
0942v8653

2

คุณยังสามารถใช้ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.