Bash 4.2에는 음수 하위 문자열 길이에 대한 지원이 추가되었습니다.
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
예 37-12. 문자열 추출 구성의 음수 매개변수
"길이" 매개변수가 음수이면 끝에서 오프셋 매개변수로 사용됩니다.
예를 들어 다음은 Ubuntu에서 테스트할 때 "World"를 출력합니다.
STR="Hello World!"
echo ${STR:6:-1}
그러나 OS X(GNU bash, 버전 4.3.42(1)-릴리스(x86_64-apple-darwin14.5.0))에서 해당 사용법은 다음 오류를 생성합니다.
-1: substring expression < 0
이 OS X에만 해당됩니까, 아니면 이후 bash 업데이트에서 다시 비활성화되었습니까? OS X에서 이 기능을 활성화하는 방법이 있습니까?
답변1
flabdablet의 솔루션은 고정 길이 문자열에 대해서만 작동하지만 이를 동적 크기 문자열의 드롭인 대체품으로 사용할 수 있습니다.
echo ${STR:6:$((${#STR} - 6 - 1))}
상세히:
${#STR}
문자열의 길이를 반환합니다.$((a - b - c))
수학적 뺄셈을 합니까${STR:start:len}
하위 문자열을 반환합니다.
따라서 하위 문자열 표현식에 두 번째 인수를 결합하면 문자열 길이에서 시작 오프셋을 빼고 새로운 bash 구문에서 음수 값으로 지정하는 값을 뺀 값이 됩니다.
답변2
${STR:6:${#STR}-7}은 STR이 최소 7자를 포함하도록 보장되는 경우 ${STR:6:-1}에 대해 작동하는 드롭인 대체품이어야 합니다. 더 짧을 수 있다면 OS X bash가 음수 길이에 대해 불평하거나 오른쪽에서 오프셋으로 사용되는 음수 길이를 지원하는 bash 버전에서 끔찍하게 잘못된 결과를 초래할 수도 있습니다.
답변3
길이를 입력으로 계산하여 동적으로 끝 부분을 절단하는 것이 가능합니다.
${STR:0:${#STR}-2}
-2는 음수입니다.
답변4
Google에서 검색한 내용여기:
그들은 ${STR:6:$#-1}
잘 작동해야 한다고 말해요
내 경우에는 비슷한 오류가 발생하여 ${VERSION::-2}
다음과 같이 0을 추가한 후 작동하기 시작했습니다 ${VERSION:0:-2}
.