Bash 매개변수 대체: 명령줄과 스크립트

Bash 매개변수 대체: 명령줄과 스크립트

연습 중이야매개변수 대체배쉬에서.

나는 다음과 같은 더미 스크립트를 작성했습니다.

#!/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개 일치합니다.

관련 정보