달성하고자하는 것에 접근하는 몇 가지 방법이 있습니다.
1. $ BASH_VERSION을 사용하십시오.
$BASH_VERSION
변수가 무엇인지 보는 것만으로 충분 합니다. 개인적으로 나는 서브 쉘을 다음과 같이 사용합니다 :
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
그 주 <<<
당신이 그것을 사용하는 거라면 여기-문서에 대한 구문은, 이식 할 수 없습니다 /bin/sh
대쉬 우분투에 있고 다른 시스템에 뭔가 다른 될 수있는,
다른 방법은 사례 설명 또는 if 문을 사용하는 것입니다. 개인적으로, 나는 이것을 할 것입니다 :
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
아마도 이식성을 위해 아마도 그러한 변수가 처음에 다음과 같은 것으로 설정되어 있는지 확인해야합니다. [ -n $BASH_VERSION ]
이것은 스크립트에서 사용되는 함수로 완전히 다시 쓸 수 있습니다. 긴 줄 :
#!/bin/bash
version_above_4(){
# check if $BASH_VERSION is set at all
[ -z $BASH_VERSION ] && return 1
# If it's set, check the version
case $BASH_VERSION in
4.*) return 0 ;;
?) return 1;;
esac
}
if version_above_4
then
echo "Good"
else
echo "No good"
fi
비록 이것이 훨씬 낫지 만 이것은 하나의 라이너가 아닙니다. 수량보다 품질.
2. 설치된 내용 확인
이를 위해 다음 apt-cache policy
과 같은 출력을 필터링해야합니다.
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
를 통한 일부 필터링과 함께 사용할 수도 있습니다 awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
시스템에 설치되어 있지 dpkg
않거나 apt
(예 : RHEL 또는 FreeBSD) 설치되어 있으면 아무 소용이 없으므로 이식성 이 없습니다.
3. 오류가있는 경우 set -e를 사용하여 스크립트를 종료하십시오.
그것을 해결하는 한 가지 방법은 단순히 연관 배열을 사용하여 사용할 bash
수 없을 때 종료 하는 것입니다. set -e
아래 줄 #!/bin/bash
은 스크립트가 연관 배열을 사용할 수없는 경우 스크립트를 종료 할 수있게합니다.
이를 위해서는 사용자에게 다음과 같이 명시 적으로 알려 주어야합니다. "배치 버전 4.3 이상이 필요합니다. 그렇지 않으면 스크립트가 작동하지 않습니다." 일부는 이것이 실제로 소프트웨어 개발에 대한 좋은 접근 방식이 아니라고 주장 할 수도 있지만 책임은 사용자에게 있습니다.
4. 모든 희망을 버리고 이식 가능한 POSIX 호환 스크립트 작성
bash
스크립트는 구문이 Bourne 쉘과 호환되지 않기 때문에 이식성이 없습니다. 작성중인 스크립트가 우분투뿐만 아니라 다양한 시스템에서 사용될 예정이라면 모든 희망을 버리고 연관 배열 이외의 것을 사용하는 방법을 찾으십시오. 여기에는 두 개의 배열이 있거나 구성 파일을 구문 분석하는 것이 포함될 수 있습니다. 구문이 적어도 다른 언어 인 Perl 또는 Python으로 전환하는 것도 고려하십시오 bash
.
$BASH_VERSION
및$BASH_VERSINFO
변수 를 살펴 보셨습니까 ?