StackOverflow新手,是bash脚本新手。我有一个尝试执行以下操作的shell脚本:
我遇到了将数据拆分并保存到每个数组中的麻烦,因为我不知道电子邮件的命令行索引将在何处停止,以及品牌的索引将从何处开始。我有什么方法可以做到这一点吗?
命令行输入我希望看起来如下:
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
提前感谢您,如果我能澄清或提供更多信息,请告诉我。
答案 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