Bash - 연속 문자열 작업

Bash - 연속 문자열 작업
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

이 두 줄을 한 줄로 묶는 방법이 있나요?

답변1

FILE=$(basename "${1/%.jpeg/.jpg}")나를 위해 작동합니다.

시험:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

스크립트 내용:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"

답변2

bash(ksh, ash 및 zsh를 제외한 기타 쉘)에는 확장을 중첩할 수 없습니다. 앞서 언급한 것처럼 중간 표현식을 임시 변수에 할당할 수 있으므로 이는 표면적인 제한일 뿐입니다. 이는 한 줄의 텍스트에서는 약간 짜증나지만 스크립트에서는 가독성이 더 좋습니다.

외부 유틸리티 사용을 피하고 basename문자열 조작 구성을 사용할 수 있습니다.

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

여기서 스크립트를 다음과 같이 다시 작성할 수 있습니다.외부에 명령 대체 넣기. 흔한 현상도 아니고, 단조로운 느낌 외에는 아무것도 얻을 수 없습니다.

좋든 나쁘든 Zsh에서는 확장 기능을 중첩할 수 있습니다.

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

또는 대신 zsh의 내장 구성을 사용할 수 있습니다 basename.

FILE=${${1:t}/%.jpeg/.jpg}

답변3

나는 다음을 선택할 것이다:

FILE=$(basename "$1" .jpeg).jpg

basename의 두 번째 인수는 파일 이름에서 제거할 접미사입니다( 참조 man basename).

답변4

Merged sed, 이것이 트릭을 수행해야 합니다:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(귀하의 질문에 정확히 대답할 수는 없습니다. 가능한지 확실하지 않기 때문입니다.)

관련 정보