如何将bash CLI参数拆分为两个单独的数组以供以后使用?

时间:2015-12-11 20:42:57

标签: arrays bash

StackOverflow新手,是bash脚本新手。我有一个尝试执行以下操作的shell脚本:

  1. cd到远程计算机上的目录中。假设我已经建立了成功的SSH连接。
  2. 将命令行输入中的电子邮件地址(输入的电子邮件地址数量从1到X)保存到一个名为“电子邮件”的数组中
  3. 将命令行输入中的品牌ID(整数)保存到一个名为' brands'
  4. 的数组中,范围从1到X个输入的品牌ID。
  5. 使用嵌套for循环来迭代电子邮件'和'品牌'数组并通过add.py
  6. 为每个品牌添加每个电子邮件地址

    我遇到了将数据拆分并保存到每个数组中的麻烦,因为我不知道电子邮件的命令行索引将在何处停止,以及品牌的索引将从何处开始。我有什么方法可以做到这一点吗?

    命令行输入我希望看起来如下:

    me@some-remote-machine:~$ bash script.sh person1@gmail.com person2@gmail.com person3@gmail.com ... personX@gmail.com brand1 brand2 brand3 ... brandX
    

    script.sh的内容如下所示:

    #!/bin/bash
    cd some/directory
    emails= ???
    brands= ???
    for i in $emails
    do
    for a in $brands
        do
        python test.py add --email=$i --brand_id=$a --grant=manage
    done
    done
    

    提前感谢您,如果我能澄清或提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

使用不可能是有效电子邮件地址的sentinel参数。例如:

$ bash script.sh person1@gmail.com person2@gmail.com '***' brand1 brand2 brand3

然后在循环中,您可以阅读参数,直到您到达非电子邮件;之后的一切都是品牌。

#!/bin/bash
cd some/directory
while [[ $1 != '***' ]]; do
  emails+=("$1")
  shift
done
shift   # Ignore the sentinal
brands=( "$@" )    # What's left

for i in "${emails[@]}"
do
  for a in "${brands[@]}"
    do
    python test.py add --email="$i" --brand_id="$a" --grant=manage
  done
done

如果您无法修改将传递给script.sh的参数,那么您可以通过@的存在与否来区分地址和品牌:

while [[ $1 = *@* ]]; do
    emails+=("$1")
    shift
done
brands=("$@")

我假设地址和品牌的数量是独立的。否则,您只需查看参数总数$#即可。假设每个都有N个。然后

emails=( "${@:1:$#/2}" )  # First half
brands=( "${@:$#/2+1}" )  # Second half