首页 > 解决方案 > 将 info.plist 中的版本替换为 Azure 管道的 bash 脚本

问题描述

我想创建一个 bash 脚本,用管道变量中的一个替换 info.plist 版本。

为此,我从简单的脚本开始:

version="201.20108.2"
build="0"
input="info.plist"

isbundle=0
isbuild=0

linenum=0

bundlelinenum=0
buildlinenum=0

while IFS= read -r line;
do
    linenum=$((linenum+1))

    if [[ $line == *"CFBundleShortVersionString"* ]]; then
      isbundle=1
    elif [[ $line == *"CFBundleVersion"* ]]; then
      isbuild=1
    elif [[ $isbundle == 1 ]]; then
      bundlelinenum=$linenum
      isbundle=0
    elif [[ $isbuild == 1 ]]; then
      buildlinenum=$linenum
      isbuild=0
    fi
    
    echo $linenum
done < $input


sed -i '${bundlelinenum}s/.*/<string>$version/' $input

由于CFBundleVersionCFBundleShortVersionString在单独的行上,然后在它们之后是版本号,我想用 $version 和 $buildnumber 的版本更新该行

info.plist

<?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>CFBundleShortVersionString</key>
    <string>17.2005.0</string>
    <key>CFBundleVersion</key>
    <string>103</string>
</dict>
</plist>

并且必须像:

<?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>CFBundleShortVersionString</key>
    <string>201.20108.2</string>
    <key>CFBundleVersion</key>
    <string>0</string>
</dict>
</plist>

如何做到这一点?

标签: bash

解决方案


使用 Bourne shell,单引号内的变量不会被替换。使用双引号:

sed -i "${bundlelinenum}s/.*/<string>$version/" "$input"

您可能也希望关闭</string>

sed -i "${bundlelinenum}s/>.*</>$version</" "$input"

推荐阅读