다음은 현재 데비안 버전을 테스트하는 데 사용하는 것입니다. 이렇게하면 더 간결하게 만들 수 있습니까?

#!/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에 알려줍니다. 마침표가 발견되면 그 뒤에 아무 것도 나오지 않게됩니다.

댓글

  • 이 답변을 자세히 설명 할 수 있나요? s/ 부분이 무엇을 의미하는지 이해하지만 \..*는 어떻습니까?
  • @DanijelJ 설명을 추가했습니다. 이미 알고있는 내용과 겹치지 만 사용자가하지 않은 내용을 제외하는 것보다 낫다고 생각했습니다. ' t. 도움이되면 알려주세요.
  • 예, 그것은 나에게 많은 것을 설명합니다. 나는 \. 두 번째를 이해하지 못했습니다. ' .. 설명 해주셔서 감사합니다.

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 

물론 더 많은 버전을 인식하도록 확장 할 수 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다