"aa" 배열에서 "bb" 배열에 정의된 IP를 제거하여 IP가255.0.0.0그리고255.255.255.0목록에서 제거됩니다아대량으로.
ksh 코드를 실행하고 나중에 aa 배열을 인쇄하면 IP가 표시됩니다.255.255.255.0삭제되지 않았나요?
내 문법에 무슨 문제가 있나요?
echo ${aa[*]}
45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12
echo ${bb[*]}
255.0.0.0 255.255.255.0
KSH 프로그램:
for run in ${bb[*]}
do
for ((i=0; i<${#aa[@]}; i++)); do
[[ ${aa[i]} == $run ]] && unset aa[i]
done
done
시험:
echo ${aa[*]}
45.32.3.5 255.255.255.0 19.23.2.12
노트:255.255.255.0은 위 목록에서 제거되어야 합니다.
답변1
귀하의 코드가 제공된 입력으로 작동하지 않는 이유를 모르겠습니다. 내 시스템에서는 ksh로 실행됩니다.
그러나 원본 코드에는 문제가 있습니다. 조건부 부분은 i<${#aa[@]}
깨지기 쉽습니다. 즉 ${#aa[@]}
, 배열 크기는 매번 감소 unset
하지만 다음 배열 요소는 자동으로 왼쪽으로 이동하지 않습니다. 귀하의 예를 들어
45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12
이것은 변화를 가져오지 않을 것입니다 – 그러나 그것은 변화를 가져올 것입니다 – 다음과 같이 말하십시오:
45.32.3.5 255.0.0.0 19.23.2.12 255.255.255.0
나는 이 문제에 대한 코드를 개선했습니다(루프 항목 이전의 할당에 유의하십시오). 또한 내부 루프(연관 배열 사용)를 제거하여 실행 시간을 2차에서 선형으로 개선했습니다.
$ cat x.sh
그것을 출력하십시오:
aa=(45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12)
bb=([255.0.0.0]=1 [255.255.255.0]=1)
print Size of input ${#aa[*]}
print Size of exclude list ${#bb[*]}
n=${#aa[*]}
for ((i=0; i<$n; ++i))
do
if [[ ${bb[${aa[i]}]} ]]
then
print Removing element with index $i: ${aa[i]}
unset aa[i];
fi
print New size of input ${#aa[*]}
done
print Resulting size of input ${#aa[*]}
print Resulting elements ${aa[*]}
for ((i=0; i<$n; ++i))
do
print Index $i, Value 'a['$i']'=${aa[$i]}
done
Fedora 17에서는 다음과 같은 출력이 생성됩니다.
$ ksh x.sh
Size of input 4
Size of exclude list 2
New size of input 4
Removing element with index 1: 255.0.0.0
New size of input 3
Removing element with index 2: 255.255.255.0
New size of input 2
New size of input 2
Resulting size of input 2
Resulting elements 45.32.3.5 19.23.2.12
Index 0, Value a[0]=45.32.3.5
Index 1, Value a[1]=
Index 2, Value a[2]=
Index 3, Value a[3]=19.23.2.12