#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
어쨌든이 두 줄을 하나의 라이너에 붙이는 것이 있습니까?
답변
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"
답변
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}
답변
나는 갈 것이다 :
FILE=$(basename $1 .jpeg).jpg
basename의 두 번째 매개 변수는 파일 이름에서 제거 할 접미사입니다 (참조 man basename
).
답변
sed
다음과 같이 단일 명령을 사용할 수 있습니다 .
FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
답변
통합 sed
하면 트릭을 수행해야합니다.
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(이것은 할 수 없기 때문에 귀하의 질문에 정확하게 답변하지는 않습니다. 가능한지 확실하지 않습니다.)
답변
Bash ${}
구문은 변수 이름으로 작동 하므로 명령을 직접 포함시킬 수 없습니다. 여분의 포크를 신경 쓰지 않으면 @ sr_의 접근법이 대안입니다.
답변
라인
FILE=$(basename "${1/%.jpeg/.jpg}")
단축 및 휴대 성이 향상
FILE=$(basename "${1%.jpeg}.jpg")