#!/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의 확장 (zsh를 제외한 ksh, ash 및 기타 셸에서도 마찬가지 임). 이것은 단지 외관상의 제한 일뿐입니다. 설명하는 것처럼 임시 변수에 중간 표현식을 할당 할 수 있기 때문입니다. 스크립트에서는 가독성면에서 틀림없이 더 좋습니다.
피할 수 있습니다. 외부 유틸리티 basename
를 부르고 대신 문자열 조작 구문을 사용합니다.
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
여기에서 다음과 같이 할 수 있습니다. 스크립트를 다시 작성하여 명령 대체를 외부에 배치 합니다. 이것은 일반적인 현상이 아니며 특정 한 줄짜리 느낌 외에는 아무것도 얻지 못합니다.
Zsh는 좋든 나쁘 든 확장을 중첩 할 수 있습니다.
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
또는 basename
대신 zsh “의 내장 구문을 사용할 수 있습니다.
FILE=${${1:t}/%.jpeg/.jpg}
답변
내가 갈 것 :
FILE=$(basename $1 .jpeg).jpg
basename의 두 번째 매개 변수는 파일 이름에서 제거 할 접미사입니다 (man basename
참조)
Answer
다음과 같이 단일 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")
를 사용하여 길이를 줄이고 휴대 성을 높일 수 있습니다.
sed
는 확실히 필요합니다.