如何将一个循环数组值添加到另一循环

时间:2019-02-18 16:31:55

标签: bash macos shell terminal

我有一个查找所有证书的脚本。系统上的身份,然后我想再添加一个证书。并删除其余的证书,除了最近添加的。

第一个循环查找我们在系统中有多少个标识并将数组设置为$var1 $var2 $var3而不是。继续。

然后我再添加一个。

现在,我想在此处删除1个循环数组值以进行循环。但是我的$ DEL变量是var1 var2,而不是我们在第一个循环中设置的实际身份。

#!/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

回显$ var1为:02KFKDSF89SFMDFMFS7908934M90DODFSMN78345

回显$ 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"

现在我要删除在第一个循环中找到的数组值。但是$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 :(得分:0)

您不需要运行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的好例子,因此我将通过使用您的命令结构来伪造我的方式,尽管我仍然不会使用所有-给vars封顶(不要这样做)。

 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

有用吗?
一如既往,请大家检查一下。我没有安装这些工具。盲目工作并可能搞砸了一些东西。 :)