如何在Bash单引号内替换变量?EC2实例ID上传SQS脚本求助
解决Bash脚本中AWS SQS消息属性的变量替换问题
你的核心问题是Bash单引号内不会解析变量,同时JSON结构里的双引号导致直接用双引号包裹会引发语法错误。这里提供几种实用的解决方法:
方法1:转义双引号并使用外层双引号
把消息属性的外层单引号换成双引号,同时对JSON内部的每个双引号添加反斜杠转义,这样Bash会解析${instanceId}变量,同时保留JSON的结构:
#!/bin/bash instanceIdFile="/var/lib/cloud/data/instance-id" instanceId=$(cat "$instanceIdFile") # 推荐用$()替代反引号,更易读且支持嵌套 echo "$instanceId" aws sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/123412341234/requestQueue \ --message-body "example message body goes here1" \ --region us-west-2 \ --message-attributes "{\"InstanceId\":{ \"DataType\":\"String\",\"StringValue\":\"${instanceId}\"}, \"Status\":{ \"DataType\":\"String\",\"StringValue\":\"Completed\"} }"
方法2:用Here文档构造JSON变量
通过Here文档提前构造消息属性的JSON字符串,这种方式无需转义内部双引号,结构更清晰,可读性更强:
#!/bin/bash instanceIdFile="/var/lib/cloud/data/instance-id" instanceId=$(cat "$instanceIdFile") echo "$instanceId" # 用Here文档生成JSON内容 message_attributes=$(cat <<EOF { "InstanceId": { "DataType": "String", "StringValue": "${instanceId}" }, "Status": { "DataType": "String", "StringValue": "Completed" } } EOF ) aws sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/123412341234/requestQueue \ --message-body "example message body goes here1" \ --region us-west-2 \ --message-attributes "$message_attributes"
方法3:用jq生成可靠的JSON(推荐)
如果系统安装了jq工具,用它来生成JSON是最稳妥的方式,完全不用手动处理引号转义,还能保证JSON格式的正确性:
#!/bin/bash instanceIdFile="/var/lib/cloud/data/instance-id" instanceId=$(cat "$instanceIdFile") echo "$instanceId" # 用jq传入变量并生成JSON message_attributes=$(jq -n --arg instance_id "$instanceId" '{ InstanceId: { DataType: "String", StringValue: $instance_id }, Status: { DataType: "String", StringValue: "Completed" } }') aws sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/123412341234/requestQueue \ --message-body "example message body goes here1" \ --region us-west-2 \ --message-attributes "$message_attributes"
另外补充:Bash中单引号内的所有内容都会被当作纯字符串,不会解析变量、转义字符等,这就是你原来代码里${instanceId}无法替换的原因。
内容的提问来源于stack exchange,提问作者satya vardhan
相关产品推荐
相关产品推荐

