쉘 스크립트의 패턴 일치 접미사 및 접두사

쉘 스크립트의 패턴 일치 접미사 및 접두사

이 변수가 있는데 접두사와 접미사를 제거하고 싶습니다.

var="abcde"
echo "${${var#a}%e}" 

나는 zsh에서 이 조각을 시도했고 잘 작동했습니다. 반환합니다 bcd. 패턴 일치(접두사 및 접미사)를 사용합니다. 하지만 posix 호환 쉘 스크립트에서 실행하면(bash 문자열 조작 대신 패턴 일치를 사용하는 이유) 출력이 bad substitution.

무슨 일이야? 저장할 다른 변수를 만들어야 합니까 "${var#a}", 아니면 한 줄로 완료할 수 있습니까? 나는 posix 호환 스크립트를 원합니다.

답변1

아니요, 다른 변수는 필요하지 않습니다. 예, 한 줄로 할 수 있습니다.

이것은 아마도 가장 이식 가능한 솔루션이지만 변수 값을 덮어씁니다(여전히 질문에 언급된 단일 변수를 사용함). 이는 쉘 언어의 매개변수 확장만 사용합니다.

var="abcde"
var="${var#a}" # remove prefix
echo "${var%e}" # remove suffix

한 줄의 코드 생성은 항상 다음과 같습니다.

var="abcde"; var="${var#a}"; echo "${var%e}"

변수를 덮어쓰고 싶지 않다면 함수 매개변수는 완벽한 임시 변수입니다. 예제는 간단하지만 사용된 추가 변수를 숨기는 함수를 만들 수 있습니다. 이 접근 방식은 POSIX 셸에 지역 변수가 없기 때문에 특히 유용합니다.

# this function runs in a subshell, so all new variables are lost on the return
remove_pre_post() (
    local_var="${1#a}" # uses the first argument
    echo "${local_var%e}"
)

var="abcde"
remove_pre_post "$var" # call function

또 다른 POSIX 호환 솔루션에는 다음이 포함될 수 있습니다 sed.

var="abcde"
echo "$var" | sed 's/^a//; s/e$//'

패턴 일치 없이 예시만 제공했습니다. 패턴 일치가 중요해지면 패턴의 복잡성에 따라 한 솔루션이 다른 솔루션보다 더 나은 것으로 보일 수 있다는 점을 명심하세요.

관련 정보