Как добавить одно значение массива цикла в другой цикл - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть скрипт, который находит все сертификаты.личность в системе, то я хочу добавить еще один сертификат.и удалите остаток Cert, за исключением того, который был добавлен недавно.

1-й цикл находит, сколько у нас идентификаторов в системе и устанавливает массив как $var1 $var2 $var3 и нет.продолжается.

Затем я добавляю еще один.

Теперь я хочу удалить здесь значения массива 1 цикла для цикла.Но моя переменная $ DEL имеет вид var1 var2, а не фактическую идентификацию, которую мы установили в 1-м цикле.

#!/bin/bash

DOM=$(/usr/sbin/dsconfigad -show | grep "Active Directory Domain" | awk '{ print $5 }')
MAC=$(/usr/sbin/dsconfigad -show | grep "Computer Account" | awk '{ print $4 }' | tr -d "$")
HOST=$MAC.$DOM
CRT=$(security find-identity -v | grep $HOST | awk '{ print $2}')



set - $CRT; index=0; while [ "$1" ]; 
do 
 let index=$index+1; 
 eval var${index}="$1"; 
 shift;
done

Результат приведенного выше цикла: + set - 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345 K69SKLD04KCM62469933FA60567LLFD730957FA3 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF

echo $var1
echo $var2

echo $ var1: 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345

echo $ var2: K69SKLD04KCM62469933FA60567LLFD730957FA3

NUMCRT=$index
echo "Number of Certificate is $NUMCRT"
echo "Add of Script part bla bla Start"
echo "ADD one more Cert"
echo "Add of Script part bla bla END"

Теперь я хочу удалить значение массива, найденное в 1-м цикле.Но $DEL значение приходит var1 var2 var3, а не 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345 K69SKLD04KCM62469933FA60567LLFD730957FA3 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF.

for i in $(seq 1 $NUMCRT); 
do 
 let $i;
 DEL="var$i"
 echo "Delete number $DEL"
done

Должно отображаться echo "Delete number $DEL" во втором for значении циклакак показано ниже.

Delete number 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345
Delete number K69SKLD04KCM62469933FA60567LLFD730957FA3
Delete number 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF

1 Ответ

0 голосов
/ 18 февраля 2019

Вам не нужно запускать dsconfigad дважды.

domain=''; machine='';
while IFS="=" read key val
do case "$key" in
   "Active Directory Domain"*) domain=$( echo $val )  ;; # strip space
          "Computer Account"*) machine=$( echo $val ) ;; # strip space
                            *) if [[ -n "$domain"  ]] &&
                                  [[ -n "$machine" ]] 
                               then break
                               fi;;
   esac
done < <( /usr/sbin/dsconfigad -show )

Я не могу найти хороший пример security find-identity -v, включая подробный вариант, поэтому я собираюсь подделать свой путь через этоиспользуя вашу структуру команд, хотя я все еще не собираюсь использовать переменные all-caps (не делайте этого).

 declare -a crt=( $( security find-identity -v | grep $machine.$domain | awk '{ print $2}' ) )

Теперь значения находятся в массиве $crt[@] с числовым индексированием.
Если вам известен индекс того, который вы хотите удалить,

unset "crt[$num]"

Это оставляет дыру в вашем массиве ...
Альтернативно, используйте сами значения в качестве ключей, ивам не придется отслеживать индексы и оставлять дыры в вашем массиве.

 declare -A crt=()
 while read one
 do crt[$one]=1
 done < <( security find-identity -v | grep $HOST | awk '{ print $2}' ) )

Теперь вы можете удалить его с помощью

unset "crt[$val]" # assuming $val is the key

или просмотреть их с помощью

for val in "${!crt[@]}"
do : something with the key...
done

Полезно?
Как всегда, ребята, пожалуйста, проверьте меня.У меня не установлен ни один из этих инструментов.Работаю вслепую и, скорее всего, что-то напортачу.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...