출력되지 않도록 변수 문자열을 올바르게 이스케이프하세요.

출력되지 않도록 변수 문자열을 올바르게 이스케이프하세요.

이 쉘 스크립트가 있습니다.

UNZIP_FOUND=$(dpkg-query -W --showformat='${Status}\n' unzip|grep "install ok installed")
    if [ "" == "$UNZIP_FOUND" ]; then
        echo unzip not found, I will install it
        apt-get --assume-yes install unzip > /dev/null
    fi

그러나 이것은 매번 다음과 같은 문장을 생성합니다.

dpkg-query: no packages found matching unzip

실제 설치 단계를 실행하기 전에.

그것을 제거하는 방법이 있습니까?

방금 dkpg-query 명령의 값을 할당했습니다.UNZIP_FOUND변수이지만 에코하고 싶지 않습니다.

이 작업을 수행하는 방법은 변수 할당을 ' 따옴표로 묶는 것이라고 읽었으며 다음과 같이 문자열을 이스케이프 처리해 보았습니다.

UNZIP_FOUND='$(dpkg-query -W --showformat=\'${Status}\n\' unzip|grep "install ok installed")'

하지만 작동하지 않습니다. 어쩌면 내 탈출이 나쁠 수도 있습니다.

답변1

당신은 간단히 할 수 있습니다

 apt-get --assume-yes install unzip

설치되어 있으면 아무 작업도 수행되지 않습니다(오래된 경우가 아니면 업그레이드됩니다).

조용히 유지하려면 --quiet해당 항목을 추가하거나 다음으로 리디렉션하세요 /dev/null.

apt-get -qq --assume-yes install unzip

( "매우 조용함", 이 표지판에 대한 설명서를 -qq참조하세요 )apt-get

패키지가 먼저 존재하는지 정말로 쿼리하고 싶다면 이렇게 할 수 있습니다.

if ! dpkg-query -W unzip >/dev/null 2>&1; then
  apt-get --assume-yes install unzip
fi

dpkg-query패키지를 찾을 수 없으면 0이 아닌 종료 상태로 종료합니다. 표준 출력과 표준 오류를 로 리디렉션합니다. /dev/null거기에는 흥미로운 내용이 쓰여 있지 않기 때문입니다.


터미널에 오류 메시지가 표시되는 이유는 dpkg-query오류가 표준 오류 스트림에 기록되는 반면 스크립트는 표준 출력 스트림만 캡처하기 때문입니다.

답변2

dpkg-query -W --showformat='${Status}\n' unzip 2>/dev/null

관련 정보