예기치 않은 토큰`( '근처의 구문 오류


11

우분투 터미널에서 아래 코드를 사용하면 정상적으로 작동합니다.

rm !(*.sh) -rf

그러나 쉘 스크립트 (clean.sh)에 동일한 라인 코드를 배치하고 터미널에서 쉘 스크립트를 실행하면 오류가 발생합니다.

clean.sh 스크립트 :

#!/bin/bash
rm !(*.sh) -rf

내가 얻는 오류 :

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

도울 수 있니?


답변:


23

rm !(*.sh)확장명 extglob을 가진 파일을 제외한 모든 파일을 제거 하는 구문입니다 .sh.

대화식 bash인스턴스에서 쉘 옵션 extglob은 다음과 같습니다.

$ shopt extglob 
extglob         on

이제 스크립트가 서브 쉘에서 실행 중이므로 extglob스크립트 시작시이를 추가 하여 활성화해야합니다 .

shopt -s extglob

따라서 스크립트는 다음과 같습니다.

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

편집하다 :

.sh확장명을 제외한 모든 파일을 제거하려면 GLOBIGNORE( 사용 하지 않으려는 경우)를 사용 extglob하십시오.

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

예 :

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

이것을 실행하지 않고 동일한 명령을 변경할 수 있습니까? shopt -s extglob?
Tal

@Tal 내 편집 내용 확인 ..
heemayl

1
감사합니다 :) (스택은 나를 :( 주석 15 문자 :( :( 쓸 수 있도록 overflaw)

그러나 여기에 두 가지 좋은 답변이 있습니다!
Tal

1
이것은 실제로 질문에 대답하는 반면, 다른 하나는 해결 방법을 설명하기 때문에 허용되는 대답이어야합니다.
Guntram Blohm은

4

좋아, 그것은 교차 포스트이지만 대답을 써야합니다. ;)

find대신 사용할 수 있습니다

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;

2

다음을 켜야 extglob합니다.

shopt -s extglob

1
@ Pilot6 : 참조하십시오 man bash. 확장 된 글러브를 사용할 수 !(...)있습니다.
choroba

이것을 실행하지 않고 동일한 명령을 변경할 수 있습니까? shopt -s extglob
Tal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.