Заменить версию в info.plist скриптом bash для конвейера Azure - PullRequest
0 голосов
/ 03 августа 2020

Я хочу создать сценарий 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

Поскольку CFBundleVersion и CFBundleShortVersionString находятся в отдельной строке, а затем после них идет номер версии, я хочу обновить эту строку с помощью версии из $ 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>

Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

С помощью одной команды GNU sed за один проход (без использования номеров строк):

version=201.20108.2
build=0
input=info.plist

sed -E '/<key>CFBundleShortVersionString<\/key>/{
           N
           s/(<string>).*(<\/string>)/\1'"$version"'\2/
       }
       /<key>CFBundleVersion<\/key>/{
           N
           s/(<string>).*(<\/string>)/\1'"$build"'\2/
       }' "$input"

Обратите внимание, что переменные version и build не должны содержать символы, которые должны цитироваться в sed.

0 голосов
/ 03 августа 2020

В оболочке Bourne переменные в одинарных кавычках не подставляются. Используйте двойные кавычки:

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

Вы, вероятно, хотите, чтобы ваше закрытие </string> тоже:

sed -i "${bundlelinenum}s/>.*</>$version</" "$input"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...