使用包含空格和多个命令的参数构造命令bash

时间:2018-05-15 03:55:49

标签: arrays bash loops parsing arguments

好的我有一个脚本我用bash写云代工厂为组织添加服务。

作为要求的一部分,用户需要能够将服务作为参数传递。 CF中的create service命令需要3个参数:service name,plan,custom-name。

arg的传递类似于-a" servicename planname customname,nextservice nextplan nextname"

我在想,为了对此进行双重解析,我必须像这样做

-a" servicename; planname; customname,nextservice; nextplan; nextname"

然后我们调用命令将其添加到cf-service servicename planname customname

或如果名称中有空格

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

所以说,我说我的脚本运行得很好,你可以提供任意数量的服务,你可以用逗号分隔。但我遇到的问题是我的组织中有一个服务,在服务名称中有一个空格,在计划名称中有一个空格。

所以我一直试图弄清楚如何构建我的函数来解析字符串以构建命令。我有一种感觉,我需要2个不同的for循环,一个将解析整个字符串前逗号,然后是第二个for循环来构建命令,如果在args中找到任何空格将它们包装在引号中。

所以这就是我迄今为止的目标

 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
    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

这现在可以正常工作,它需要args,如果有空格我们将arg包装在引号中,我们解析它,并且;它现在就像一个冠军。

1 个答案:

答案 0 :(得分:0)

这是函数的这一部分的最终版本,因为它正在做我想做的事情

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