#!/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/)"
(귀하의 질문에 정확히 대답할 수는 없습니다. 가능한지 확실하지 않기 때문입니다.)