使用Shell脚本中的xml文件中的密钥读取值

时间:2019-06-13 11:07:31

标签: bash shell xamarin.forms sh

我需要使用Shell脚本从app.config文件读取环境变量,并且需要在constant.cs文件中进行设置。

这是我关注的链接:

https://github.com/microsoft/appcenter/blob/master/sample-build-scripts/xamarin/app-constants/appcenter-pre-build.sh

我具有来自xamarin.form的以下格式的app.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
    <add key="appId" value="12974" />
    <add key="url" value="https://abc.xyz.com" />
</appSettings>

这是我用来读取config.file并将其设置为constant.cs文件的代码。但是我不确定哪个会起作用。

if [ -e "$APP_CONSTANT_FILE" ]
then
    if [ -e "$ENV_FILE" ]
    then
        echo "Both Config files are available"
        #name=applicationID
        #$ awk -F\" -v n="$name" '/<ATTRIBUTE NAME="/ && $2==n {print $4}' data 
        #awk -F"\"" ' /AppId/ {print $4}' = -F"\"" ' /appID/ {print $4}' $APP_CONSTANT_FILE $ENV_FILE
        awk 'FNR==NR{a[FNR]=$0;next}{$NF=gensub(/value=".*"\/>/,"value=\""a[FNR]"\"\/>","g",$NF);print}' $APP_CONSTANT_FILE $ENV_FILE
        #sed -i '' 's#ApiUrl = "[-A-Za-z0-9:_./]*"#ApiUrl = "'$API_URL'"#' $APP_CONSTANT_FILE

        echo "File content:"
        cat $APP_CONSTANT_FILE
    else
        echo "Can not locate $ENV_FILE file"
        exit
    fi
else
    echo "Can not locate $APP_CONSTANT_FILE file"
    exit
fi

请提供给我参考或提示以按键读取值并将其设置为.cs文件

2 个答案:

答案 0 :(得分:1)

您未提供文件constant.cs的格式,但可以使用以下格式:

cat config.xml | grep '<add ' | sed -E 's/.*key="?([^ "]*)"? value=([^ ]*) .*/\1 = \2;/'

输出将是:

appId = "12974";
url = "https://abc.xyz.com";

如果需要不同的输出,只需更改代码的这一部分:\1 = \2;,其中\1是键,\2是值。

答案 1 :(得分:0)

正如评论中指出的那样,用bash脚本解析通用XML是一个坏主意。另外,您没有指定输出格式,这可能有助于提供更好的替代方法。

无论如何,如果您完全确定输入文件的格式总是和示例中的一样漂亮,并且始终使用双引号,并且在键和值,而<appSettings>是出现<add>元素的唯一地方,还有许多其他if,这是一个bash循环,用于提取键和值:

while read addkeyval; do
    key=$(echo "$addkeyval" | sed 's#.* key="\([^"]*\)".*#\1#')
    value=$(echo "$addkeyval" | sed 's#.* value="\([^"]*\)".*#\1#')
    echo "key='$key' value='$value'"
done < <(grep "<add " "$ENV_FILE")

此代码效率低下且脆弱,我将不对其进行解释。是否要弄清楚如何将其集成到脚本中,还是要花时间遵循注释中的一些好的建议,完全取决于您。我只是想进行一些bash编程练习;-)

相关问题