편집: 발견된 요소를 제거하는 방법을 알아내야 합니다.

편집: 발견된 요소를 제거하는 방법을 알아내야 합니다.

다음 내용의 배열이 있습니다.

# 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에서 원하는 작업을 수행합니다 .bashzsh

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' "$@"

관련 정보