1

这是我的情况。我有一组设备 ID。我知道哪个设备 ID 与哪个 IP 地址对应。我想使用设备 ID 找到正确的 IP 地址并将它们都传递给命令。我正在使用 shell 脚本来执行此操作。

这是我想要的一些伪代码。

这是我的字典类型的东西,匹配 id 和 ip,没有特定的顺序

 dictionary_thing = ( id:ip
                      id:ip
                      id:ip
                      id:ip )

这是我没有按特定顺序使用的 id 数组

 array_of_used_ids = ( id
                       id
                       id )

也许为找到的每个 id 创建一个具有两个属性(id 和 ip)的对象数组

 array_object
 for(int i=0; i<count; i++)
 {
      array_object[i]= new object and set id to dictionary_thing id and ip
 }

然后我想在 for 循环中运行所有命令(或任何你建议的)

 for id in array_of_used_ids
    ./run_this_command with 

 for(int i=0; i<count; i++)
 {
      ./command array_object[i].ip array_object[i].id
 }
4

1 回答 1

2

您已经构建了主数组,因此从使用的 ID 构建一个正则表达式

regex="^${array_of_used_ids[0]}:"
i=1
while [ $i -lt ${#array_of_used_ids[*]} ]; do
 regex="$regex|^${array_of_used_ids[$i]}:"
 i=$(( $i + 1))
done

这应该给你一个正则表达式,如 "^id:|^id:|^id:" 然后迭代你的字典检查每个正则表达式,匹配时,用空格替换分隔的 ':'

array_object=()
i=0
j=0
while [ $i -lt ${#dictionary_thing[*]} ]; do
 if [[ $dictionary_thing[$i] =~ $regex ]]; then 
   array_object[$j] = ${dictionary_thing[$i]/:/ } #if it is possible for an ID to contain a ':', you will need a different method for splitting here
   j=$(( $j + 1 ))
 fi
 i=$(( $i + 1 ))
done

最后,迭代你的结果对象并执行命令

i=0
while [ $i -lt ${#array_object[*]} ]; do
 command_to_execute ${array_object[$i]}
 i=$(( $i + 1 ))
done
于 2013-06-21T18:35:40.617 回答