Создайте команду с аргументами с пробелами и несколькими командами bash - PullRequest
0 голосов
/ 15 мая 2018

Хорошо, у меня есть скрипт, который я пишу на bash для облачного литейного производства, чтобы добавить сервисы в организацию.

Как часть требования, пользователь должен иметь возможность передавать сервисы в качестве аргумента. Команда создания сервиса в CF принимает 3 аргумента: имя сервиса, план, произвольное имя.

Аргумент передается в виде -a "имя_службы имя_пользователя, имя_первой службы_сервис_планирование_последующее имя_

Я думал, что для того, чтобы выполнить двойной анализ, мне нужно сделать это следующим образом

-a "servicename; имя плана; пользовательское имя, nextservice; nextplan; nextname"

затем мы вызываем команду для ее добавления cf create-service servicename имя_пользователя имя_пользователя

или если в имени есть пробелы

cf create-service "servicename" "planname" "customname"

Итак, с учетом сказанного, мой скрипт работает нормально, и вы можете предоставлять столько услуг, сколько хотите, разделив запятую. Но у меня проблема в том, что в нашей организации есть одна служба, в имени которой есть пробел, а в названии плана - пробел.

Итак, я пытался выяснить, как построить мою функцию для анализа строки для построения команды. У меня такое чувство, что мне нужно 2 различных цикла for, один из которых будет анализировать всю строку перед запятой, а затем второй цикл for для создания команды, и если в аргументах найдены пробелы, чтобы обернуть их в кавычки.

Так вот, что я имею до сих пор

 add_service() {
  if [ -n "${ADDSERVICEID}" ]
    then
      if [ "${ADDSERVICEID}" == "default" ]
        then
          ....Our Default services are here
          echo "The following services are now enabled in your organization"
          cf services
      else
        IFS=","
        for i in "${ADDSERVICEID[@]}"; do
          if [[ $i =~ \ ]]; then
            $i=\"$i\"
          fi
            for i in "${FULLSERVICE[@]}"; do
               $i
              echo "The following services are now enabled in your organization"
              cf services
            done
          done
      fi
  fi
}

В основном я работаю над секцией else как моей секцией по умолчанию, так как все они статичны и работают нормально. Я уверен, что, вероятно, передумаю об этом, и ответ, вероятно, смотрит мне прямо в лицо, но у меня просто проблема, оборачивающая это вокруг меня. Кроме того, изменение названий услуг или планов, чтобы не было пробелов, для нас не вариант.

Спасибо всем за вашу помощь, и я надеюсь, что, как только у нас будет ответ на этот вопрос, он поможет другим в будущем.

ОБНОВЛЕНИЕ: Хорошо, теперь это вроде как работает. Я могу добавить свои услуги с пробелами в их именах. Отлично.

Теперь, однако, если я добавлю несколько служб для добавления, он просто объединит все вместе в одном операторе вместо синтаксического анализа,

Вот обновленный код

  else
    IFS=","
    for arg1 in "${ADDSERVICEID[@]}"; do
      IFS=";"
        CREATESERVICE=""
        for arg2 in "${arg1[@]}"; do
          if [[ $arg2 =~ \  ]]
           then
            $arg2=\'\"$arg2\"\'
          fi
          CREATESERVICE+="${arg2}"
          echo ${CREATESERVICE}
          cf create-service ${CREATESERVICE}
          echo "The following services are now enabled in your organization"
          cf services
        done
    done
  fi

Я вставил только от остальных

ОБНОВЛЕНИЕ: Да, ты должен удалить некоторые цитаты, не удивительно, что он собирал все это как одну строку. Вздох Я думаю, что пора спать

else
  IFS=,
  for arg1 in ${ADDSERVICEID[@]}; do
    IFS=";"
      CREATESERVICE=""
      for arg2 in "${arg1[@]}"; do
        if [[ $arg2 =~ \  ]]
         then
          $arg2=\'\"$arg2\"\'
        fi
        CREATESERVICE+=${arg2}
        echo ${CREATESERVICE}
        cf create-service ${CREATESERVICE}

      done
  done
  echo "The following services are now enabled in your organization"
  cf services
fi

Теперь все работает как надо, он принимает аргументы, если в них есть пробелы, мы заключаем аргумент в кавычки, анализируем его на, и; так что теперь он работает как чемпион.

1 Ответ

0 голосов
/ 15 мая 2018

Это окончательное исполнение этой части функции на данный момент, поскольку она делает то, что я хотела, чтобы она делала

else
  IFS=,
  for arg1 in ${ADDSERVICEID[@]}; do
    IFS=";"
      CREATESERVICE=""
      for arg2 in "${arg1[@]}"; do
        if [[ $arg2 =~ \  ]]
         then
          $arg2=\'\"$arg2\"\'
        fi
        CREATESERVICE+=${arg2}
        echo ${CREATESERVICE}
        cf create-service ${CREATESERVICE}

      done
  done
  echo "The following services are now enabled in your organization"
  cf services
fi
...