이 간단한 스크립트를 사용하여 사용자가 Docker 레지스트리에 로그인했는지 확인하려고 합니다. 사용자가 로그인되어 있으면 출력은 이고 Login Succeeded
, 로그인하지 않으면 입력하라는 메시지가 표시됩니다 Username
.
#!/bin/bash
if [ $(docker login registry.example.com | grep -E 'Login Succeeded') -z ]
then
echo 'failed'
else
echo "ok"
fi
그러나 나는 항상 명령의 출력을 얻기 때문에 이것은 실패합니다 docker login
. 내가 뭘 잘못했나요?
답변1
대부분의 명령줄 도구와 마찬가지로 성공 시 docker login
종료 코드가 반환되고 0
실패 시 0이 아닌 종료 코드가 반환됩니다. if
다음과 같은 조건에서 직접 확인해 보면 충분합니다.
if docker login registry.example.com > /dev/null 2>&1
이는 로그인이 성공할 때 조건이 true라고 주장 if
하고 stdout 및 stderr을 로 리디렉션하여 억제합니다 /dev/null
.
또는 주장하는 경우 플래그를 grep
사용하여 일반적인 일치 출력을 억제할 수 있지만 -q
종료 코드를 다시 셸로 설정하면 됩니다.
if docker login registry.example.com 2>/dev/null | grep -q "Login Succeeded"
쉘은 연산자가 피연산자 값을 제공할 것으로 기대하지만 피연산자 값을 볼 수 없으며 명령 대체의 결과는 값이 무엇이든 관계없이 항상 구문 오류를 발생시키기 때문에 조건문 if
은 결코 성공하지 않습니다.[ $(..) -z ]
-z
$(..)