Debian 패키지가 설치되어 있는지 확인하는 루프

Debian 패키지가 설치되어 있는지 확인하는 루프

저는 Debian/Ubuntu에 여러 패키지가 설치되어 있는지 확인하고 싶습니다. 이를 위해 사용하려는 스크립트는 다음과 같습니다.

query=`dpkg-query -W -f '${Status}'`
ok="install ok"

if ! [ `$query`  curl == "$ok" ] ;then 
apt-get -y -qq install curl >> /dev/null 2>&1
fi

밝혀지다

Install: target Installed is not a directory 

하지만 이는 두 번째 변수에서 볼 수 있는 것과 같아야 합니다. 이 문제를 처리할 올바른 방법을 찾을 수 없어서 머리가 아프네요.

답변1

불필요하게 복잡한 방식으로 일을 하고 있는 것 같습니다. 왜 안되지?

dpkg -l curl || apt-get -y -qq install curl > /dev/null 2>&1

결국 당신은 농담을 요청했습니다. 아마도 당신이 원하는 것은 그것이 사용 가능한지 아는 것이므로 curl이 작업도 수행할 수 있습니다.

type curl >/dev/null 2>&1 || apt-get -y -qq install curl

답변2

코드에는 두 가지 버그가 있습니다. 하나는 심각하고 하나는 덜 심각합니다.

  1. 백틱을 두 번 사용했습니다. 백틱도 사용하지 마세요. 다음과 같이 명령 대체를 사용하십시오.$(command ...)

    query=$(dpkg-query -W -f '${Status}')
    

    쿼리에는 이미 명령 호출 결과가 포함되어 있습니다. 지금 실행하면

    `$query`
    

    이제 결과를 실행하려고 시도할 것입니다. 귀하의 경우에는 문자열입니다. 저에게는 다음을 포함하는 매우 긴 문자열이었습니다.install ok installedinstall ok installed...

  2. (Costas가 이것을 지적했습니다.) 의지의 결론 dpkg-query -W -f '${Status}' curlinstall ok installed이것이 당신이 확인하는 것이 아니라는 것입니다.

답변3

패키지가 설치되어 있는지 확인하고 그렇지 않으면 설치하는 것은 의미가 없습니다. 누구나:

  1. 컬 바이너리와 같이 패키지에 원하는 것이 있는지 확인할 수 있으므로 command -v curl사용자는 필요한 경우 대안을 제공할 수 있습니다.
  2. 다음과 같은 것을 사용할 수 있습니다 apt-cache policy.

이러한 조건 중 어느 것도 적용되지 않으면 직접 설치가 더 간단합니다.

관련 정보