2013-06-21 3 views
1

Вот моя ситуация. У меня есть массив идентификаторов устройств. Я знаю, с какого идентификатора устройства идут IP-адреса. Я хочу использовать идентификатор устройства, чтобы найти правильный IP-адрес и передать оба из них в команде. Для этого я использую сценарий оболочки.Используйте карту или словарь, чтобы найти значение

Вот какой-то код psuedo для чего я хочу.

Это мой словарь типа предмет соответствия идентификаторов с IP-адресов, без особого порядка

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

Это мой массив идентификатора, который я использую в произвольном порядке

array_of_used_ids = (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 
} 

затем я хочу r ип все команды в цикле (или то, что вы предлагаете)

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 
} 
+0

какая ОС и раковина? – iruvar

+0

Mac и 3.2.48 (1) -изъявление. Это то, что вы имели в виду с ароматом? – KKendall

+0

по вкусу оболочки я имею в виду один из 'bash',' ksh', 'tcsh' и т. Д. – iruvar

ответ

2

Вы уже ваши основные массивы построены, поэтому построить регулярное выражение из используемых идентификаторов

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: |^идентификатор:" Тогда итерация вашей проверки каждый против регулярные выражений, когда подобрано, замените разделяющий словарь ':' с пространством

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 

Наконец, итерация переизбрания sult и выполнить команду

i=0 
while [ $i -lt ${#array_object[*]} ]; do 
command_to_execute ${array_object[$i]} 
i=$(($i + 1)) 
done 
+1

Оглядываясь назад, я полагаю, вы могли бы просто выполнить комманд во втором цикле, устраняя необходимость в array_object и третьем цикле. – Joe