
bash 스크립트를 작업 중인데 문제가 발생했습니다. 나는 일반적인 if/fi 문을 사용하여 RH 7, Debian 7, Ubuntu 등과 같은 OS 버전 선택과 관련된 변수를 설정하는 데 사용하려고 노력하고 있습니다. 내가 겪고 있는 문제는 내가 생각했던 것처럼 작동하지 않습니다. 각 부분을 손으로 실행하면 잘 작동하지만 모든 것을 스크립트에 넣으면 아무 것도 없습니다.
이를 수행하는 더 좋은 방법이 있습니까? 미리 감사드립니다
value1=$(cat /etc/redhat-release | awk '{ print $4 }' | cut -c 1)
value2=$(cat /etc/redhat-release | awk '{ print $3 }' | cut -c 1)
value3=$(lsb_release -sr)
value4=$(cat /etc/debian_version)
if [[ $value1 -eq 7 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH7
elif [[ $value2 -eq 6 ]] && [[ -e /etc/redhat-release ]]; then
OS=RedHat
VER=RH6
elif [[ $value3 = 14.04 ]]; then
OS=Ubuntu
VER=UB1404
elif [[ -e /etc/debian_version ]] && [[ $value4 -eq 7 ]]; then
OS=Debian
VER=DEB7
fi
답변1
귀하의 문제는 수레와 문자열을 비교할 때 문제가 될 수 있다고 생각합니다.
AFAIK, 테스트는 부동 소수점 값을 처리할 수 없으므로 테스트 $value3 = 14.04
에서는 syntax error: invalid arithmetic operator (error token is ".04")
.
다음과 같이 숫자를 문자열로 처리할 수 있습니다. 또한 데비안 7.8의 경우 반환된 를 문자열로 처리하는 데 필요한
elif [[ "$value3" == "14.04" ]]; then
따옴표도 확인하세요 .$value3
7.8
기본 버전 번호만 비교하려면 지점 뒤의 부분을 제거할 수도 있습니다. 이렇게 하면 매개변수 를 사용하여 구분 기호로 정의한 에서
value3=$(lsb_release -sr | cut -d. -f1)
반환된 문자열을 분할 한 다음 결과의 첫 번째 열을 선택합니다. . 이는 value4 에서도 작동합니다 . 이렇게 하면 .lsb_release -sr
.
-d.
-f1
value4=$(cat /etc/debian_version | cut -d. -f1)
/etc/debian_version
7.8
7
cut
존재하지 않는 파일에 대한 경고를 표시하지 않을 수도 있습니다. 사용 가능한 Redhat 시스템이 없으므로 처음 2개 명령의 오류 메시지를 /dev/null
다음과 같이 리디렉션했습니다.
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )
다른 도움이 필요하면 알려주시기 바랍니다. 또한 문제가 어디에 있는지 확인할 수 있도록 일부 출력과 스크립트의 예상 출력을 추가하십시오.