Запустите цикл for, используя переменную bash через запятую - PullRequest
0 голосов
/ 31 января 2019

У меня есть список коллекций в виде переменной с запятой в 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

Что я делаю неправильно?

Как правильно?

1 Ответ

0 голосов
/ 01 февраля 2019

Трудно догадаться, какое ваше желаемое поведение происходит из набора кода, который не демонстрирует такое поведение, но для того, чтобы сделать снимок, следующее будет запускать mongo один раз для каждого элемента вlist_collection, каждый раз с другим 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

Альтернативно, запуск mongo только один раз (но потеря способности определять, по какому индексу произошел сбой) может выглядеть так:

#!/usr/bin/env bash

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

buildMongoCommand() {
  printf '%s\n' "use $mongo_db;"
  for i in "${listItems[@]}"; do
    cat <<EOF
      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
}

"${Mongo_Home}/mongo" "${mongo_host}/${mongo_db}" \
    -u "${mongo_user}" -p "${mongo_password}" \
  < <(buildMongoCommand) \
  || { echo "Mongo query failed" >&2; exit 200; } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...