주어진 문자열이 배열의 항목과 일치하는지 확인하는 방법은 무엇입니까?

주어진 문자열이 배열의 항목과 일치하는지 확인하는 방법은 무엇입니까?

디렉토리 목록이 있습니다. 그들 중 일부는 이름에 패턴이 있습니다. 나는 이러한 패턴에 대한 배열을 만들었습니다.

그런 다음 결과를 반복 find하여 각 결과를 각 패턴과 비교하고 일치하는 경우 항목을 건너뛰어야 합니다.

이것은 내 코드입니다.

declare -a patterns=("*Api" "*Panel" "Common" "Site*" ".*")
while read folder; do
    if [[ $folder == "" ]]; then continue; fi
    for pattern in "${patterns[@]}"
    do
        echo  "Checking $folder $pattern ..."
        if [[ $folder == $pattern ]]; then
            echo "Matched $folder $pattern"
        fi
    done
done <<< "$({ find /some-path -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f3 | sort })"

그러나 이것은 작동하지 않습니다. 예를 들어 AdminApi디렉터리는 와 일치해야 합니다 *Api.

정적으로 수행하면 if [[ AdminApi == *Api ]]; then echo 'yes'; fi작동하는 것처럼 됩니다.

하지만 배열로 반복하면 작동하지 않습니다.

여기서 문제가 무엇입니까?

답변1

zsh대신 사용하면 bash이 작업이 더 쉬워지고 더 안정적이 됩니다.

typeset -A patterns=(
  '*Api'   .
  '*Panel' .
  'Common' .
  'Site*'  .
  '.*'     .
)
for dir in /some/path/*(ND/:t); do
  matched_patterns=( ${(k)patterns[(K)$dir]} )
  if (( $#matched_patterns )) print -r -- $dir matched ${(j[, ])matched_patterns}
done

예를 들어 다음과 같습니다.

.Panel matched .*, *Panel
SiteApi matched Site*, *Api

이는 다음을 사용합니다.K 아래 첨자 기호연관 배열의 경우 확장 시 패턴이 아래 첨자와 일치하는 요소로 키를 반환합니다. 그리고k 매개변수 확장 플래그, 이는 반환된 값이 아닌 키입니다. 이를 제거하고 연관 배열을 다음과 같이 정의할 수 있습니다.

typeset -A patterns=(
  '*Api'   'API pattern'
  '*Panel' 'panel pattern'
  Common   Common
  'Site*'  'site pattern'
  '.*'     'hidden file'
)

얻으려면 :

.Panel matched hidden file, panel pattern
SiteApi matched site pattern, API pattern

예를 들어.

목적이 이러한 패턴과 일치하는 디렉터리 목록을 얻는 것이라면 다음과 같습니다.

patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames

또는 일치하지 않는 경우:

set -o extendedglob
patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/^(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames

귀하의 접근 방식에 관해서는 다음을 읽어보십시오.

이 중 어느 것도 그것이 당신에게 효과가 없는 이유를 설명하지 않습니다.

그것은 나에게 효과적입니다.

Checking .Panel *Api ...
Checking .Panel *Panel ...
Matched .Panel *Panel
Checking .Panel Common ...
Checking .Panel Site*, ...
Checking .Panel .* ...
Matched .Panel .*
Checking SiteApi *Api ...
Matched SiteApi *Api
Checking SiteApi *Panel ...
Checking SiteApi Common ...
Checking SiteApi Site* ...
Matched SiteApi Site*
Checking SiteApi .* ...

bash -o xtracebash -x무슨 일이 일어나고 있는지 확인 하려면 (the same as)를 사용하여 스크립트를 실행해야 할 수도 있습니다 .

또는:

BASH_XTRACEFD=7 7> file.log bash -o xtrace ./the-script

추적 출력을 파일에 저장합니다.

또는 선택한 위치에 일부 set -o xtrace( 비활성화)를 추가하여 +o해당 추적을 활성화/비활성화하세요.

관련 정보