1. ホーム
  2. bash

[解決済み] if not true条件」を作るには?

2022-03-24 05:18:43

質問

が欲しいのですが 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

解決方法は?

試す

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

grep リターン true は、検索対象が見つかれば false となります。

だからNOT false == true .

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

また、あなたのコードをそのまま見てみると、あなたの使っている $( ... ) のようなcmd-substitutionの形式は賞賛に値しますが、そのプロセスから何が出てくるかを考えてみてください。試しに echo $(cat /etc/passwd | grep "sysa") をクリックすると、私の言いたいことがわかります。それをさらに進めるために -c (カウント) オプションを grep に指定して、次のようにします。 if ! [ $(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 はcmd-lineでファイル名を受け取れるので、余計なプロセスやパイプ構造を呼び出す必要はないでしょう?)

お役に立てれば幸いです。