Mongodb 使用逗号分隔的bash变量运行for循环

Mongodb 使用逗号分隔的bash变量运行for循环,mongodb,bash,for-loop,Mongodb,Bash,For Loop,我在Bash中有一个集合列表,作为逗号分隔的变量,如下所示 list_collection=$collection_1,$collection_2,$collection_2,$collection_4 我想连接到Mongodb,并在这些集合上运行一些命令 我已经做了如下,但我没有得到循环的工作 ${Mongo_Home}/mongo ${mongo_host}/${mongo_db} -u ${mongo_user} -p ${mongo_password} <<EOF use

我在
Bash
中有一个集合列表,作为逗号分隔的变量,如下所示

list_collection=$collection_1,$collection_2,$collection_2,$collection_4
我想连接到
Mongodb
,并在这些集合上运行一些命令 我已经做了如下,但我没有得到循环的工作

${Mongo_Home}/mongo ${mongo_host}/${mongo_db} -u ${mongo_user} -p ${mongo_password} <<EOF 
use ${mongo_db};for i in ${list_collection//,/ } 
do 
  db.${i}.reIndex();
  db.${i}.createIndex({
  "recon_type":1.0,
  "account_name":1.0,
  "currency":1.0,
  "funds":1.0,
  "recon_status":1.0,
  "transaction_date":1.0},
  {name:"index_def"});
  if [ $? -ne 0 ] ; then 
    echo "Mongo Query to reindex ${i} failed" 
    exit 200 
  fi 
done
EOF

${Mongo_Home}/Mongo${Mongo_host}/${Mongo_db}-u${Mongo_user}-p${Mongo_password}很难从一堆没有表现出这种行为的代码中猜出你想要的行为是什么,但是为了尝试一下,下面的代码将在
列表
集合中的每个项目运行
Mongo
,每次使用不同的heredoc:

#!/usr/bin/env bash

# read your string into a single array
IFS=, read -r -a listItems <<<"$list_collection"

# iterate over items in that array
for i in "${listItems[@]}"; do
  { # this brace group lets the redirection apply to the whole complex command
    "${Mongo_Home}/mongo" "${mongo_host}/${mongo_db}" \
                          -u "${mongo_user}" -p "${mongo_password}" ||
      { echo "Mongo query to reindex $i failed" >&2; exit 200; } 
  } <<EOF
  use ${mongo_db}; 
  db.${i}.reIndex();
  db.${i}.createIndex({
    "recon_type":1.0,
    "account_name":1.0,
    "currency":1.0,
    "funds":1.0,
    "recon_status":1.0,
    "transaction_date":1.0
  }, {name:"index_def"});
EOF
done

很难从一堆没有表现出这种行为的代码中猜出你想要的行为是什么,但是为了尝试一下,下面将对
list\u collection
中的每个项目运行一次
mongo
,每次运行一次不同的herdoc:

#!/usr/bin/env bash

# read your string into a single array
IFS=, read -r -a listItems <<<"$list_collection"

# iterate over items in that array
for i in "${listItems[@]}"; do
  { # this brace group lets the redirection apply to the whole complex command
    "${Mongo_Home}/mongo" "${mongo_host}/${mongo_db}" \
                          -u "${mongo_user}" -p "${mongo_password}" ||
      { echo "Mongo query to reindex $i failed" >&2; exit 200; } 
  } <<EOF
  use ${mongo_db}; 
  db.${i}.reIndex();
  db.${i}.createIndex({
    "recon_type":1.0,
    "account_name":1.0,
    "currency":1.0,
    "funds":1.0,
    "recon_status":1.0,
    "transaction_date":1.0
  }, {name:"index_def"});
EOF
done

嗯。你在heredoc中输入的任何内容都将是stdin to
mongo
的一部分,因此
for i in
中的
实际上不是由任何内容运行的。无论如何,你希望它运行多少次
mongo
?现在,它只运行一次
mongo
。如果希望循环启动多个副本,则需要将
for
放在外部,将
mongo
命令放在内部。你在heredoc中输入的任何内容都将是stdin to
mongo
的一部分,因此
for i in
中的
实际上不是由任何内容运行的。无论如何,你希望它运行多少次
mongo
?现在,它只运行一次
mongo
。如果希望循环启动多个副本,则需要将
for
放在外部,将
mongo
命令放在内部。我希望连接到mongo一次,并为每个集合运行命令如果这样做,则只有一个
$?
(对于执行所有命令的单个运行),那么,您希望如何知道重新索引失败的是
$i
的哪个值?我希望连接到mongo一次并为每个集合运行命令如果这样做,则只有一个
$?
(对于执行所有命令的单个运行),那么您希望如何知道重新索引失败的是
$i
的哪个值?