연습 중이야매개변수 대체배쉬에서.
나는 다음과 같은 더미 스크립트를 작성했습니다.
#!/bin/bash
var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"
pattern='.[0-9]?(.random).ext'
echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"
기본적으로 이 모드는 파일 이름의 마지막 부분을 제거하도록 설계되었습니다.
더미 스크립트를 실행하면 다음과 같은 결과가 발생합니다.
~$ ./dummy.sh
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext
ing 스크립트의 내용 eval
또는 이와 동등한 명령 시퀀스를 대화형 셸에 직접 입력하면 다음이 생성됩니다.
~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext
패턴이 '.[0-9]*.ext'
작동하므로 문제는 명백히 부분 문자열로 제한됩니다 '?(.random)'
. ?
매개변수 대체 컨텍스트에서 예약된 문자이기 때문에 문제가 발생할 수 있습니다 . 그러나 그것이 문제라면 두 경우 모두 모드가 실패하거나 성공할 것으로 예상합니다.
명백한 함정은 어디에 있습니까?
답변1
문제는 extglob
쉘 옵션이 스크립팅 쉘이 아닌 대화형 쉘에서 설정된다는 점일 수 있습니다.
$ shopt -u extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
$ shopt -s extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext
shopt -s extglob
따라서 스크립트에서 shebang 줄 뒤에 넣어 볼 수 있습니다 .
~에서배쉬 참조 매뉴얼:
extglob
내장 명령을 사용하여 셸 옵션을 활성화 하면shopt
여러 확장 패턴 일치 연산자가 인식됩니다.... 다음 하위 패턴 중 하나 이상을 사용하여 복합 패턴을 형성할 수 있습니다.
?(PATTERN-LIST)
주어진 패턴이 0개 또는 1개 일치합니다.