「真でない場合の条件」を作成するにはどうすればよいでしょうか? 質問する

「真でない場合の条件」を作成するにはどうすればよいでしょうか? 質問する

が true でないecho場合にコマンドを実行したいと思います。cat /etc/passwd | grep "sysa"

何が間違っているのでしょうか?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

ベストアンサー1

試す

if ! grep -q sysa /etc/passwd ; then

greptrue検索対象が見つかった場合は を返し、false見つからなかった場合は を返します。

したがって、偽 ( ! false) == ではありませんtrue

ifシェルでの評価は非常に柔軟に設計されており、多くの場合、コマンドのチェーンは必要ありません (あなたが書いたように)。

また、コードをそのまま見ると、$( ... )cmd-substitution 形式を使用していることは賞賛に値しますが、プロセスから何が出てくるかを考えてみてください。私の言っていることを理解してみてください。grepに (count) オプションをecho $(cat /etc/passwd | grep "sysa")使用してから実行することで、さらに進めることができますが、これは機能しますが、かなり古い方法です。-cif ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then

しかし、次のような最新のシェル機能(算術評価)を使用することもできます。

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`

これにより、C-lang ベースの比較演算子==,<,>,>=,<=,%やその他のいくつかの演算子を使用できるという利点も得られます。

この場合、Orwellophileのコメントによれば、算術評価はさらに次のように削減できる。

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

または

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

最後に、というがありますUseless Use of Cat (UUOC)。:-) 飛び上がってゴスカと叫ぶ人もいるでしょう。 はgrepコマンドラインでファイル名を取得できるので、必要がないのに余分なプロセスやパイプ構造を呼び出す必要はないとだけ言っておきます。;-)

これが役に立つことを願っています。

おすすめ記事