如何将bash脚本退出代码返回到ARM模板?

时间:2018-08-10 12:02:38

标签: bash shell azure arm-template

我有一个名为vm.sh的bash脚本,它将调用vm-template.json文件,该文件包含类型Microsoft.Compute/virtualMachines/extensions,并从该模板中使用调用了另一个bash(main.sh)脚本。 commandToExecute ,main.sh文件将调用另一个sh文件(sub.sh),然后从那里我返回退出代码为1,但是它没有反映在vm.sh中,后者将退出代码返回为0

vm.sh

az group deployment create --name "$DEPLOYMENT_NAME" --template-file "$TEMPLATE_FILE_PATH"

template.json

{
            "type": "Microsoft.Compute/virtualMachines/extensions",
            "name": "[concat(parameters('vmName'),'/test')]",
            "apiVersion": "[variables('computeApiVersion')]",
            "location": "[variables('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/deployments', variables('vmTemplateName'))]"
            ],
            "properties": {
                "publisher": "Microsoft.Azure.Extensions",
                "type": "CustomScript",
                "typeHandlerVersion": "2.0",
                "autoUpgradeMinorVersion": true,
                "forceUpdateTag": "v.1.0",
                "settings": {
                   "fileUris": ["[parameters('initScriptURL')]"]
                },
                "protectedSettings":{
                    "commandToExecute": "[concat('bash main.sh', ' ', parameters('name'))]"
                }
            }
        }

sub.sh

type -p <package>

subScriptExitCode="$?"

if [ "$subScriptExitCode" -ne 0 ]; then
    return 1
fi

main.sh

source "sub.sh"

subScriptExitCode=$?

log "subScript ExitCode: $subScriptExitCode"

if [ $subScriptExitCode -ne 0 ]; then
    exit $subScriptExitCode
fi

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找shell选项set -e

在脚本的开头设置$?会导致它们在任何命令以非零状态退出时立即退出,而不是显式地对set -e进行所有检查。

对于您的每个.sh文件,只需在任何其他命令之前(在#!/usr/bin/env bash(或类似的shebang)之后)添加以下行:

#!/usr/bin/env bash
set -e
...

如果要记录日志,可以使用trap s进行记录。例如:

(只需删除sub.sh,然后编辑main.sh如下:

#!/usr/bin/env bash
set -e 

onError() {
  log "command check exit code: $1"
}

trap 'onError $?' ERR

command -v <package>

NB: command -vtype -p更具移植性