【问题标题】:Construct command with arguments with spaces and multiple commands bash使用带空格和多个命令的参数构造命令 bash
【发布时间】:2018-10-24 19:24:27
【问题描述】:

好的,我正在用 bash 编写一个脚本,用于云代工厂向组织添加服务。

作为要求的一部分,用户需要能够将服务作为参数传递。 CF 中的 create service 命令采用 3 个参数,即服务名称、计划、自定义名称。

arg 像 -a "servicename planname customname, nextservice nextplan nextname" 一样传入

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

-a "服务名称;计划名称;自定义名称,下一个服务;下一个计划;下一个名称"

然后我们调用命令添加 cf create-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 部分作为我的默认部分,因为它们都是静态工作。我敢肯定我可能想多了,答案可能正盯着我看,但我只是遇到了一个问题。此外,更改服务名称或计划不包含空格也不是我们的选择。

感谢大家的帮助,我希望一旦我们对此有答案,它将帮助其他人。

更新:好的,现在可以正常工作了。我可以在服务名称中添加空格。太好了。

但是,现在如果我给它提供多个服务来添加它,只需在一个语句中将它们全部拼凑在一起,而不是在 , 上进行解析,

这是更新的代码

  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 开始粘贴

更新:呃,你必须删除一些引号,难怪它会将它们全部作为一个字符串来提取。唉,我想该睡觉了

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 用引号括起来,我们在 , 和 ; 上解析它所以它现在就像一个冠军。

【问题讨论】:

  • 添加一个shebang,然后将您的脚本粘贴到那里:shellcheck.net

标签: arrays bash loops parsing arguments


【解决方案1】:

这是目前这部分功能的最终演绎,因为它正在做我想要它做的事情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多