【问题标题】:How to add one loop arrays value to another loop如何将一个循环数组值添加到另一个循环
【发布时间】:2019-02-19 01:13:57
【问题描述】:

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

第一个循环找到我们在系统中有多少个身份,并将数组设置为$var1 $var2 $var3,没有。继续。

然后我再添加一个。

现在我想在这里删除 1 个循环数组值 for loop。但是我的 $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

它应该在第二个for循环值中显示echo "Delete number $DEL",如下所示。

Delete number 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345
Delete number K69SKLD04KCM62469933FA60567LLFD730957FA3
Delete number 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF

【问题讨论】:

    标签: bash macos shell terminal


    【解决方案1】:

    您不需要运行 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 的一个很好的例子,所以我将通过使用你的命令结构来伪造我的方式,尽管我仍然不会使用全大写变量(不要那样做)。

     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
    

    有用吗?
    和往常一样,请大家检查我。我没有安装这些工具中的任何一个。盲目地工作,可能会搞砸一些事情。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2012-09-22
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多