
この単純なスクリプトを使用して、ユーザーが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
失敗するとゼロ以外の終了コードが返されます。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
$(..)