【原帖置頂】shell文件中讀取plist文件并實現(xiàn)shell中的數(shù)值計算
Mac操作plist文件用PlistBuddy,路徑在/usr/libexec/PlistBuddy。
0. 準備工作
先準備一個簡單的plist文件,當前BundleVersion的值為1。

測試用的plist
這個plist文件對應的xml代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Udid</key>
<string>bf76c991995e61c5c783f3441bff4a18605bc7ba</string>
<key>BundleId</key>
<string>com.foobar2000.mobile</string>
<key>IpaPath</key>
<string>/users/ypf/desktop</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict>
</plist>
1. 讀取plist中的值
// Print:讀取值并打印的命令
// /usr/libexec/PlistBuddy -c:指定PlistBuddy的路徑
// -c:后接要執(zhí)行的命令(不負責任地猜測是傳遞cmd參數(shù)的意思^_^)
// CFBundleVersion:要讀取value的key
// /Users/ypf/Desktop/Test.plist:plist文件的路徑
/usr/libexec/PlistBuddy -c "Print CFBundleVersion" /Users/ypf/Desktop/Test.plist

執(zhí)行效果
2. 用變量保存讀到的BundleVersion
這個值后面還要用,所以需要定義一個變量保存起來~~
BundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" /Users/ypf/Desktop/Test.plist)
echo $BundleVersion
3. 變量的值+1
終端下直接寫+ - * /(加減乘除)會被當做字符串,寫計算表達式要用到expr。
// 注意!expr之后有個空格
BundleVersion=`expr $BundleVersion + 1`
用echo $BundleVersion輸出結果,可以看到BundleVersion的新值為2.

計算BundleVersion的新值
4. 將變量的新值保存到plist
PlistBuddy向plist文件寫入命令為Set
// 指定plist路徑、目標鍵值對的key
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $BundleVersion" /Users/ypf/Desktop/Test.plist
執(zhí)行上述命令后,BundleVersion的新值為2。

執(zhí)行結果
5. Done!
附:原帖中給出的自動編譯打包ipa的shell文件
shell文件中讀取plist文件并實現(xiàn)shell中的數(shù)值計算
#!/bin/bash
#Author Jileniao.Net
SCHEMENAME='JILENIAO'
DATE=`date +%Y%m%d_%H%M`
SOURCEPATH=$( cd "$( dirname $0 )" && pwd)
IPAPATH=$SOURCEPATH
DISNAME=$SCHEMENAME"_"$DATE
ARCHNAME=$DISNAME.xcarchive
IPANAME=$DISNAME
ExportOptions='ExportOptions.plist'
INFOPLIST=$SCHEMENAME/Info.plist
BUNDLE_ID='net.jileniao.iosblog'
DISPLAY_NAME='極樂鳥'
VERSION_NAME='1.0.5'
#BUILD_CODE='153'
PROVISION_PROFILE='jileniao-dis'
# 測試版APP
if [ -n "$1" ]; then
# extra parameter 1
fi
rm -rf ./build
rm main.jsbundle
rm main.jsbundle.meta
rm -rf ./Build
rm -rf ./ModuleCache
rm -rf ./Logs
xcodebuild clean
CURR=`pwd`
cd .. && react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle --assets-dest ios/
cd $CURR
# 先讀取之前的BUILD_CODE,加1得到新的BUILD_CODE
BUILD_CODE=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $INFOPLIST)
BUILD_CODE=`expr $BUILD_CODE + 1`
# 設置編譯參數(shù)
/usr/libexec/PlistBuddy -c "Set CFBundleDisplayName $DISPLAY_NAME" $INFOPLIST
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $VERSION_NAME" $INFOPLIST
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $BUILD_CODE" $INFOPLIST
/usr/libexec/PlistBuddy -c "Set CFBundleIdentifier $BUNDLE_ID" $INFOPLIST
/usr/libexec/PlistBuddy -c "Delete provisioningProfiles" $ExportOptions
/usr/libexec/PlistBuddy -c "Add provisioningProfiles dict" $ExportOptions
/usr/libexec/PlistBuddy -c "Add provisioningProfiles:$BUNDLE_ID string $PROVISION_PROFILE" $ExportOptions
# 構建
xcodebuild archive \
-project JILENIAO.xcodeproj \
-scheme $SCHEMENAME \
-configuration Release \
-archivePath $ARCHNAME \
clean \
build \
-derivedDataPath ./
if [ -e $ARCHNAME ]; then
echo "xcodebuild archive Successful"
else
echo "xcodebuild archive Failed"
exit 1
fi
# 導出ipa
xcodebuild -exportArchive \
-archivePath $ARCHNAME \
-exportPath $IPANAME \
-exportOptionsPlist $ExportOptions
if [ -e $IPANAME ]; then
echo "Export ipa Successful"
open $IPAPATH
else
echo "Export ipa Failed"
exit 1
fi
#刪除臨時文件
rm -rf $ARCHNAME
rm -rf ./Build
rm -rf ./ModuleCache
rm -rf ./Logs