
이것이 배열의 요소를 검색하는 방법입니다.
count=${#ARRAY[@]}
lsearch()
{
status=-1
for((i=0;i<count;i++))
do
Temp=$1
if [[ $Temp -eq ${ARRAY[i]} ]]
then
status=0
searches=$((i+1))
return
fi
done
}
(a b c d)
한 배열의 모든 요소를 다른 배열에서 찾아야 한다고 가정해 보겠습니다 ( a h c d l k)
.
이제 한 배열의 각 요소에 대해 for 루프를 사용하여 다른 배열을 반복해야 합니다. 더 좋은 방법이 있나요?
답변1
첫 번째 배열의 각 값에 대해 두 번째 배열의 각 항목을 반복하지 않으려면 연관 배열을 사용해야 합니다. awk에서는 다음과 같이 할 수 있습니다.
$ a=(a b c d);
$ b=(a h c d l k);
$ awk 'BEGIN{RS = FS} NR == FNR {a[$1] = 1; next} $1 in a' \
<(echo "${a[*]}") <(echo "${b[*]}")
a
c
d
순수한 bash는 다음과 같습니다(조금 투박하지만:
declare -A a
a=([a]=1 [b]=1 [c]=1 [d]=1)
declare -A b
b=([a]=1 [h]=1 [c]=1 [d]=1 [l]=1 [k]=1)
for i in ${!a[*]}; do
if [ ! -z "${b[$i]}" ]; then
echo "$i is in both";
fi;
done
답변2
순수 bash는 두 번째 배열의 모든 항목을 반복하지 않으며 "투박"하지도 않습니다.이 답변.
a=(a b c d);
b=(a h c d l k);
newArr=($(
for item in ${a[@]}; do
[[ ${b[*]} =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] \
&& echo "$item"
done
))
echo ${newArr[@]}
a c d
echo ${!newArr[@]}
0 1 2
첫 번째 배열의 항목에서 새 배열을 만들 수도 있습니다.아니요두 번째 배열에 있습니다. &&
으로 바꾸시면 ||
.
newArr=($(
for item in ${a[@]}; do
[[ ${b[*]} =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] \
|| echo "$item"
done
))
echo ${newArr[@]}
b