예상치 못한 마크업 근처의 구문 오류

예상치 못한 마크업 근처의 구문 오류

Jenkins에서 이 명령을 실행 중이며 sh를 사용합니다. 하지만 내 bash 스크립트에서 이 오류가 무엇을 의미하는지 잘 모르겠습니다.

#! /bin/sh
for d in $(ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} ) ;do echo $d; done
test.sh: command substitution: line 3: syntax error near unexpected
token `(' test.sh: command substitution: line 3:
`ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} )'

답변1

/bin/sh일반적으로 이러한 패턴을 이해하지 못하는 셸 에서 실행되는 스크립트에서 확장된 글로빙 패턴을 사용하려고 합니다 .

또는 (각 쉘에서 적절한 옵션 설정) 과 bash같이 이러한 모드를 이해하는 쉘로 전환하거나 다음과 같이 이를 이해하는 것을 사용하십시오 .kshzsh/bin/shfind

#!/bin/sh

find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -exec basename {} \;

또는 GNU를 사용하는 경우 find:

#!/bin/sh

find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -printf '%f\n'

!두 예 모두에서 질문의 앞부분이 오타라고 가정합니다 .cdf*

임의로 복잡한 명령을 실행하기 위해 xargs파이프라인에서처럼 find완벽 find하게 사용 가능한 조건자를 실행 해야 하는 경우는 거의 없습니다 .-exec

반품,왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?


더 많은 수동 접근 방식:

#!/bin/sh

for pathname in kube/xx/bb/*/; do
    [ -d "$pathname" ] || continue

    name=${pathname%/}
    name=${name#kube/xx/bb/}

    case $name in
        abc*|cdf*) continue ;;
    esac

    printf '%s\n' "$name"
done

관련 정보