if 및 shopt를 사용하는 Linux 쉘 스크립트

if 및 shopt를 사용하는 Linux 쉘 스크립트

다음 쉘 스크립트를 작성했습니다.

#!/bin/bash
...
#delete downloaded file

if [ "$param" == "delete" ]; then

    shopt -s extglob
    cd $DataPersistent/download/
    rm -f !($label.*)
    cd $DataPersistent/swm/install_pkg/
    rm -rf !($label|$label.json|active.json)
    shopt -u extglob
fi
...

해당 문을 제거하면 if제대로 작동하지만 추가하면 if다음 오류가 발생합니다.

/usr/local/bin/clear.sh: line 17: syntax error near unexpected token `('
/usr/local/bin/clear.sh: line 17: `    rm -f !($label.*)'

원인은 무엇입니까? 어떻게 해결할 수 있나요?

답변1

shopt -s extglob쉘의 구문을 변경하십시오. 이 문이 없으면 확장된 와일드카드 패턴 !($label|$label.json|active.json)은 잘못된 구문입니다.

문제는 쉘이 쉘 옵션이 shopt활성화된 상태에서 명령을 실행하기 전에,extglob전체 if명세서구문 분석 중 구문 오류가 발견되었습니다.

허용된 구문을 변경해야 하는 줄이 복합 명령(즉, 문 ) if의 일부가 아닌 경우 shopt명령이 이미 활성화되어 있으므로 extglob작동합니다.

이 문제를 해결하려면 문 앞에 활성화한 extglob다음 if비활성화하십시오.

이것은 여기서 발견된 것과 동일한 문제입니다.복합 명령에서 bash 옵션 설정

관련 정보