首页 > 解决方案 > 将命令替换变量与常规变量进行比较

问题描述

我正在使用 Jenkins 部署一个 bash 脚本,然后该脚本在 Azure VM 上执行几个其他脚本(使用 Azure CLI)。我正在尝试在 azure cli 调用上使用命令替换,以便我可以根据收到的输出在脚本中创建条件,但我似乎无法将命令替换变量与字符串进行比较。

在此之前我也有以下条件使用正确的凭据登录到 azure,我对此没有问题,但我以命令替换仅返回“启用”的方式解析它,所以我有这个:

echo "Waiting for credentials to be initialized..."
auth_init=$(az login --service-principal -u $azure_client_id -p $azure_client_secret -t $azure_tenant_id --query [].state -o tsv)
sleep 10

if [ "$auth_init" != 'Enabled' ]; then
    echo "Credentials couldn't be initialized, aborting..." | tee -a "$errordir/error.log" 
    exit 2
else
    echo "Credentials initialized successfully!"
fi

az account set -s $azure_subscription_id
echo "Subscription set to $azure_subscription_id"

哪个没有问题。然后我有下一部分:

echo "Executing Proc Health Check Script..."
proc_check=$(az vm run-command invoke -g $azure_vm_rg -n $azure_vm_hostname --query value[0].message -o tsv --command-id RunShellScript --scripts "@health_check_proc.sh" | tr -d '[]')
sleep 20
echo "Execution results are:"
echo $proc_check

if [ "$proc_check" = 'Enable succeeded: stdout Proc is running, waiting for installation to finish... stderr' ]; then
    echo "Proc Health Check is successful, proceeding with installation health check..."
else
    echo "Proc Health Check failed, aborting..." | tee -a "$errordir/error.log" 
    exit 2
fi

但是无论我做什么,即使我回显了 proc_check 的输出并且它看起来与我的条件中的字符串完全相同,它们只是在 if 语句中不匹配。请记住,我已经尝试过 = 和 == 进行比较,条件的单括号和双括号,单引号或双引号变量和/或字符串。而且我还认为 azure 的输出可能不完全相同,因为它可能有制表符分隔而不是我的空格,所以我使用 od -c 将它与另一个变量与我的字符串进行比较,它们看起来完全一样.

编辑:这是使用 set -x 运行的失败部分:

+ az vm run-command invoke -g *** -n *** --query 'value[0].message' -o tsv --command-id RunShellScript --scripts @health_check_proc.sh
+ tr -d '[]'
+ proc_check='Enable succeeded:
stdout
Proc is running, waiting for installation to finish...

stderr'
+ sleep 20
+ echo 'Execution results are:'
Execution results are:
+ echo Enable succeeded: stdout Proc is running, waiting 'for' installation to finish... stderr
Enable succeeded: stdout Proc is running, waiting for installation to finish... stderr
+ '[' 'Enable succeeded:
stdout
Proc is running, waiting for installation to finish...

stderr' '=' 'Enable succeeded stdout Proc is running, waiting for installation to finish... stderr' ]
+ echo 'Proc Health Check failed, aborting...'
+ tee -a /var/jenkins_home/...
Proc Health Check failed, aborting...
+ exit 2

解决方案:对于同样苦苦挣扎的人,我将 $proc_check 传送到:tr -d '\n'删除换行符,然后返回的输出变为“启用成功:stdoutProc 正在运行,等待安装完成...stderr ” ,但是,嘿,我可以使用它。

标签: bashazure

解决方案


你需要匹配整个字符串吗?如果您只需要“启用成功”部分,可能会切断“:”字符之后的所有内容(使用 bash 参数扩展魔术“%”运算符)。

if [ "${proc_check%%:*}" = 'Enable succeeded' ]; then

更新:我看到了您添加的调试输出,看起来 proc_check 有不在您的比较字符串中的换行符。我认为像我建议的那样切断多余的文字是最好的方法。

另一个更新:我所做的后续评论的代码,如果重要的文本是“Proc is running”,你可以像这样匹配它:

proc_check=$(az vm run-command invoke -g $azure_vm_rg -n $azure_vm_hostname --query value[0].message -o tsv --command-id RunShellScript --scripts "@health_check_proc.sh" | tr -d '[]' | grep -o "Proc is running")

如果不存在,则文本将为空。所以你可以像这样检查它:

if [ "$proc_check" = 'Proc is running' ]; then

推荐阅读