다음 내용의 배열이 있습니다.
# echo "${ARRAY[@]}"
1=Napp Slice
4=NNN Issue
3=GG Allow
2=CO-OP
1=Quit
해당 단어를 포함하는 요소가 있는지 확인하기 위해 반복하고 싶습니다. Quit
그렇다면 해당 요소를 변수로 설정하십시오. 그래서 아래에서 실행했습니다.
for x in ${ARRAY[@]}; do
if [ $x == *Quit* ]; then
FOO=$x
echo $FOO
else
break
fi
done
나는 그것이 나에게 반환되기를 원 1=Quit
하지만 실행하면 다음과 같은 결과를 얻습니다.
# ./myScript.ksh
1=Napp Slice
4=NNN Issue
3=GG Allow
2=CO-OP
1=Quit
어떻게 뽑아낼 수 있지?오직Quit
?를 포함하는 요소
게시하기 전에 이 문제가 존재하는지 확인하려고 노력했지만 쉘 스크립팅이 처음입니다. 나는 매우 간단한 것을 놓치고 있다고 확신하지만 그것을 알아낼 수 없는 것 같습니다.
KSH 구문만 사용할 수 있으므로 KSH 구문만 사용하십시오.
편집: 발견된 요소를 제거하는 방법을 알아내야 합니다.
감사합니다!
답변1
다음을 사용하여 스크립트를 실행하려고 하면 오류가 발생합니다 ksh93
. 또한 패턴과 일치하지 않는 경우 즉시 실행합니다. 이는 루프를 한 번만 반복할 수 있음을 의미합니다. 배열의 출력이 무엇인지는 확실하지 않지만 표시된 코드가 아닐 가능성이 높습니다.==
[ ... ]
break
어쨌든 다음 스크립트는 셸(및 결과 및 ) ksh93
에서 원하는 작업을 수행합니다 .bash
zsh
array=(
'1=Napp Slice'
'4=NNN Issue'
'3=GG Allow'
'2=CO-OP'
'1=Quit'
)
for element in "${array[@]}"; do
if [[ "$element" == *Quit* ]]; then
foo=$element
printf '%s\n' "$foo"
break
fi
done
[[ ... ]]
패턴 일치 연산자와 함께 사용할 때는 주의하세요 ==
. 또한 ${array[@]}
각 요소가 공백으로 분할되지 않고 개별적으로 인용되도록 따옴표 확장에 주의하세요 .
의견에서 배열에서 요소를 제거하고 싶다고 말씀하셨습니다. 배열 요소에 대해 반복하는 경우에는 이 작업을 수행할 수 없지만 배열의 인덱스에 대해 반복하는 경우 요소 설정을 해제할 수 있습니다.
for index in "${!array[@]}"; do
if [[ "${array[index]}" == *Quit* ]]; then
foo=${array[index]}
unset -v 'array[index]'
printf '%s\n' "$foo"
break
fi
done
이로 인해 어딘가에 요소가 "누락"된 배열이 제공될 수 있으며 숫자 인덱스가 더 이상 연속되지 않습니다.
아래 코드는 위의 두 번째 코드 블록의 기능을 대략적으로 재현하지만 sh
몇 가지 추가 기능을 추가합니다. 이것은 순전히 우리 자신의 오락을 위해 제공됩니다.
#!/bin/sh
set -- '1=Napp Slice' \
'4=NNN Issue' \
'3=GG Allow' \
'2=CO-OP' \
'1=Quit'
unset -v found
for element do
shift
case $element in (*Quit*) found=$element; continue; esac
set -- "$@" "$element"
done
printf 'Element = %s\n' "${found-(was not found)}"
printf 'Remaining list:\n'
printf '\t%s\n' "$@"