มีข้อผิดพลาดทางไวยากรณ์เพียงข้อเดียวที่คุณทำ $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