bash 使用 xargs 和 sleep 从频道中删除 Slack 成员?

bash 使用 xargs 和 sleep 从频道中删除 Slack 成员?

我希望能够从“私人”Slack 频道中删除一批人员。

使用案例:糟糕,我刚刚将 137 人添加到了错误的频道!

Slack 成员 ID 列表是从 Airtable 电子表格列中获取的。

  1. 从 Airtable 复制单元格范围
  2. 将值格式化为单空格分隔的字符串
  3. 将频道 ID 添加到 MemberID 列表之前

像这样构造输入参数:

$ sh script.sh ChannelID MemberID1[ MemberID2 MemberID3 ...]

#!/bin/bash
args=("$@")
channel=${args[0]}
for arg in "${@:2}"; do
  curl -X POST \
    -H 'Authorization: Bearer foobar' \
    -H "Content-Type":"application/json; charset=utf-8" \
    --data '{"channel":"'"$channel"'", "user":"'"$arg"'"}' \
    https://slack.com/api/conversations.kick;
done

Slack API 方法我的 cURLing 仅限于一次对一个 MemberID 进行操作,并且仅限于每分钟仅接受 50 个 cURL POST (3 级)。我想要获取 50 多个 MemberID 列表,并确保它们仅在 50 个成员批次中进行 cURL,间隔一分钟。

我开始研究 xargs 并做到了:

if [ ${#args[@]} -gt 2 ]; then
  echo "channel ID: $channel"
  echo "${#args[@]} items in the argument array"
  echo "${@:2}"
  xargs -n 2 <<<${@:2} | xargs -I {} echo {} | sed -e 's/ /,/g'
fi
$ sh test.sh FO1O2B3A4R 1 2 3 4 5 6 7 8 9 10 11
    channel ID: FO1O2B3A4R
    12 items in the argument array
    1 2 3 4 5 6 7 8 9 10 11
    1,2
    3,4
    5,6
    7,8
    9,10
    11

我可以使用 xargs 来制作 50 个成员的批次,然后对于其中每一个成员,触发 cURL 命令,然后sleep 60s在触发批次之间等待一分钟 ( ) 吗?

答案1

如果你想批量处理 50 件事情,那么使用循环xargs -n 50可能是最好的选择while

例如

list="user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 user11 user12 user13 user14 user15 user16 user17 user18 user19 user20 user21 user22 user23 user24 user25 user26 user27 user28 user29 user30 user31 user32 user33 user34 user35 user36 user37 user38 user39 user40 user41 user42 user43 user44 user45 user46 user47 user48 user49 user50 user51 user52 user53 user54 user55 user56 user57 user58 user59 user60 user61 user62 user63 user64 user65 user66 user67 user68 user69 user70 user71 user72 user73 user74 user75 user76 user77 user78 user79 user80 user81 user82 user83 user84 user85 user86 user87 user88 user89 user90 user91 user92 user93 user94 user95 user96 user97 user98 user99 user100"

echo "$list" | xargs -n 50 echo | while read line
do
  echo Do Something with $line
  sleep 61
done

如果我们运行它,我们可以看到循环运行了两次:

Do Something with user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 user11 user12 user13 user14 user15 user16 user17 user18 user19 user20 user21 user22 user23 user24 user25 user26 user27 user28 user29 user30 user31 user32 user33 user34 user35 user36 user37 user38 user39 user40 user41 user42 user43 user44 user45 user46 user47 user48 user49 user50
Do Something with user51 user52 user53 user54 user55 user56 user57 user58 user59 user60 user61 user62 user63 user64 user65 user66 user67 user68 user69 user70 user71 user72 user73 user74 user75 user76 user77 user78 user79 user80 user81 user82 user83 user84 user85 user86 user87 user88 user89 user90 user91 user92 user93 user94 user95 user96 user97 user98 user99 user100

你可以在while循环内做任何你喜欢的事情

答案2

由于您已经有了 中的列表$@,另一种方法是循环遍历它并在 50 批次标记处休眠:

#!/bin/bash
channel=$1
shift

index=0
while [ "$#" -gt 0 ]
do
  (( ++index ))
  curl # ... --data ... "user":"'"$1"'"
  (( index % 50 == 0 )) && sleep 60
  shift
done

我省略了大部分curl命令,以便更容易地查看我所提议内容的结构。第一个更改是将通道名称放入其自己的变量中,并将该参数移开。然后,其余元素$@是用户名。

下一部分是一个简单的while循环,只要 中还有元素就会运行$@。每次循环时,我们:

  • 增加一个计数器
  • 呼吁curl$1
  • sleep如果我们应该
  • shift离开第一个元素$@

相关内容