bash - 将命令替换变量与常规变量进行比较
问题描述
我正在使用 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 ” ,但是,嘿,我可以使用它。
解决方案
你需要匹配整个字符串吗?如果您只需要“启用成功”部分,可能会切断“:”字符之后的所有内容(使用 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
推荐阅读
- npm - 使用 IDE 或任务运行器添加多个文件
- c# - 在 WPF 中,根据自定义类的属性对 ListBox 或 ListView 进行分组
- python - 我正在用 Python 为我的雇主创建一个库存系统,我应该将库存信息存储在 SQLite 数据库中吗?
- python - 熊猫在 groupby 级别 2 总和或平均条件上删除行
- mongodb - 聚合嵌入文档数组
- ios - 如何以编程方式设置自定义粗体字体 - swift
- javascript - 在 HTML / JSON 中使用 i18n
- css - 使用 LESS,我可以在嵌套子元素中引用父元素吗
- c++ - iOS AVCaptureSession 流微音频 Objective-C++
- python - 一直拿不到 CSRF 令牌