首页 > 解决方案 > Bash在变量中添加单引号

问题描述

因此,我在使用用于在 MongoDB 中自动创建分片副本集的脚本时遇到了问题。

脚本如下:

#!/bin/bash

set -x

export shard_ips='[10.0.0.206,10.0.0.142,10.0.0.234]'

export shard_count=3

export replication_set_number=1

shard_count=$((shard_count-1))

IFS="," read -a shard_ips_arr <<< $(echo $shard_ips | tr -d '[]')

primary_shard_ip=${shard_ips_arr[0]}

count=0
while [ $count -le ${shard_count} ]
do
  shard_ips_arr[$count]=$(echo { _id: $count, host: \"${shard_ips_arr[$count]}:27017\" } )
  count=$(($count + 1))
done
function join { local IFS="$1"; shift; echo "$*"; }

shard_ips_arr=$(join , "${shard_ips_arr[@]}")

echo "${shard_ips_arr}"

echo "mongo --eval 'rs.initiate( { _id: \"shardreplset${replication_set_number}\", members: [ ${shard_ips_arr} ] } )' ${primary_shard_ip}:27017"

mongo --eval 'rs.initiate( { _id: "'shardreplset${replication_set_number}'", members: [ '${shard_ips_arr}' ] } )' ${primary_shard_ip}:27017

上述脚本的目的是接收从 terraform 传递过来的字符串数组,并将其转换为 MongoDB 可以理解的内容。一个完整的命令应该如下所示:

mongo --eval 'rs.initiate( { _id: "shardreplset1", members: [ { _id: 0, host: "10.0.0.206:27017" },{ _id: 1, host: "10.0.0.142:27017" },{ _id: 2, host: "10.0.0.234:27017" } ] } )' 10.0.0.206:27017

这将使用主分片 (10.0.0.206:27017) 创建三个 MongoDB 服务器的副本集。

问题是包含 bash 似乎添加到变量中的单引号。我从脚本的最后一行收到的调试输出(使用 set -x)如下:

+ mongo --eval 'rs.initiate( { _id: "shardreplset1", members: [ {' _id: 0, host: '"10.0.0.206:27017"' '},{' _id: 1, host: '"10.0.0.142:27017"' '},{' _id: 2, host: '"10.0.0.234:27017"' '} ] } )' 10.0.0.206:27017

在 $shard_ips_arr 的每个项目中看到所有这些额外的单引号吗?例子:

{' _id: 0, host: '"10.0.0.206:27017"' '} 应该看起来像{ _id: 0, host: "10.0.0.206:27017" }

有谁知道如何解决这个问题?

如果您认为单引号实际上不是问题,也请告诉我。

如果您需要其他任何澄清,也请告诉我。

标签: mongodbbashterraform

解决方案


推荐阅读