다음 쉘 스크립트를 작성했습니다.
#!/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 옵션 설정