다음은 현재 데비안 버전을 테스트하는 데 사용하는 것입니다. 이렇게하면 더 간결하게 만들 수 있습니까?
#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == "7.3" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.2" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.1" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.0" ]; then VERSION=7 fi
이 작업을 수행하는 가장 매력적인 방법이 아니라는 것을 알고 있습니다. 내가 원하는 것은 /etc/debian_version
의 파일을 사용하여 .
이전의 버전 번호를 읽고 이후의 번호를 무시하는 방법을 이해하는 것입니다.
if [ $(cat /etc/debian_version) == "7.*" ]; then
사용해 보았고
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
그러나 이들 중 어느 것도 나를 위해 일하지 않았습니다. 데비안 7.4가 출시되면이 스크립트에 의존하는 모든 스크립트를 다시 살펴보고 변경할 필요가 없도록 향후 스크립트를 증명하고 싶습니다.
lsb_release -a
관련 정보를 보여줍니다. 원하는 것을 “잘라 내고”데비안 6 또는 7인지 확인하는 방법을 모르겠습니다. 상상할 수있는 원래 스크립트 , 꽤 길다.
나를 지적 할 수있는 다른 모든 게시물은 내가 원하는 부분 만 나누는 응답을 “절단”하는 방법을 사용하여 감사 할 것입니다.
답변
원하는 작업을 수행하는 방법에는 여러 가지가 있습니다. 이것은 버전 번호에서 소수점과 그 이후의 모든 것을 제거합니다.
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
는 마침표 ( \.
) 뒤에 0 개 이상의 문자 (.*
)가옵니다. 따라서 sed
의 경우 s/\..*//
표현식은 마침표와 그 뒤에 오는 모든 내용을 아무것도 바꾸지 않음을 의미합니다. sed
명령의 결과는 환경 변수 VERSION
에 저장됩니다.
위의 내용은 if / then / elif /…/ fi 문. bash 및 일반 / bin / sh 모두에서 작동합니다.
MORE : sed
는 스트림 편집기입니다. 즉, stdin에서 행을 읽고 지침에 따라 편집 한 다음 (일반적으로) stdout으로 보냅니다. 이 경우 “대체”명령을 내립니다. 예를 들어, s/foo/bar/
는 foo의 첫 번째 항목을 찾아서 bar로 대체 함을 의미합니다. 특별한 경우로 s/foo//
는 foo
를 아무것도없는 것으로 바꾸는 것을 의미합니다. 우리의 경우에는 마침표 다음에 아무 문자 나 아무것도없는 것으로 바꾸고 싶습니다. 이제 마침표는 “.”입니다. sed
는 일반적으로 마침표를 “모든 문자”를 의미하는 것으로 처리한다는 점을 제외하고. 따라서 우리는 앞에 백 슬래시를 넣어 “탈출”해야합니다. sed
에 \.
가 표시되면 문자 그대로의 마침표를 의미합니다. 또한 마침표 이후의 모든 문자를 지우고 싶습니다. “모든 문자”를 나타 내기 위해 마침표 .
(이스케이프 없음)를 사용합니다. 그러나 일반적으로 우리는 얼마나 많은 문자가 있는지에 관계없이 마침표 이후의 모든 문자를 삭제하려고합니다. 따라서 sed
“의 언어에서 마침표는 모든 문자를 의미하고 별표는”앞선 문자의 모든 수 “(0 일 수 있음)를 의미합니다. 따라서 마침표 별 .*
는 0 개 이상의 모든 문자를 의미합니다. 따라서 모두 합치면 s/\..*//
가 sed
에 알려줍니다. 마침표가 발견되면 그 뒤에 아무 것도 나오지 않게됩니다.
댓글
Answer
여기 “가 외부 유틸리티없이 bash를 사용하는 솔루션입니다. 이며 단일 호출입니다.
read -d . VERSION < /etc/debian_version
/etc/debian_version
를 읽고 입력을 마침표 (.
), 기간 이전의 모든 항목을 VERSION
에 할당하고 이후의 모든 항목을 삭제합니다.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
VERSION_MINOR 기간 이후의 모든 항목을 저장한다는 점에서 약간 다릅니다.
IFS="." read -a VERSION < /etc/debian_version
이것은 가장 강력한 기능입니다. 기간별로 분할되어 $VERSION
배열에 할당됩니다. 버전이 1.2.3
이면 ${VERSION[0]} == 1
${VERSION[1]} == 2
및 ${VERSION[2]} == 3
.
댓글
- 이것은 훌륭합니다!나는 ' 이렇게 사용되는 읽기를 본 적이 없습니다!
답변
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
물론 더 많은 버전을 인식하도록 확장 할 수 있습니다.
s/
부분이 무엇을 의미하는지 이해하지만\..*
는 어떻습니까?\.
두 번째를 이해하지 못했습니다. '.
. 설명 해주셔서 감사합니다.