If then ステートメントで特殊なシェル変数を使用する方法

If then ステートメントで特殊なシェル変数を使用する方法

$?私はスクリプトに初めてアクセスし、grepコマンドが成功したことを確認するために値を確認する方法を学びたいと思います。もしgrep コマンドは次のようになります。失敗するそれから次の値を含むメッセージをエコーし​​ます。$name。これを達成するには、Ifステートメントと特別なシェル変数を使用できることを知っていますが、正しい構文はわかりません。以下のコードで試してみました。

name=$1
         if [ "$name" =  "" ]
         then  echo -n "Name 'DBS' is not in directory"
            read name
         fi

grep -i $name mike ~admin/dbs/email
grep -i goodman ~admin/dbs/passwd

答え1

これはかなり一般的な構文です。より多くのエラーチェックを実行できますが、目的の作業範囲内でこれが正しい方向に行くことができると思います。

#!/bin/bash

file=/etc/hosts

if [ -z "$1" ]; then
    echo Usage: $0 name 1>&2
    exit 2
fi

if grep -q "$1" $file ; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

ノート

  • test最初の()は、(最初​​のコマンドライン引数)が空の文字列(または指定されていない場合)の場合はif [ -z "$1" ]; then ...trueです。$1
  • この行は次のようにUsage:出力されます。stderr1>&2
  • 出力自体はgrep非表示になります(見たいエラー出力を除く)。この場合、出力が成功したか(一致項目が見つかったか)だけを知りたいからです。
    • grepすべての出力を無音に設定するパラメータがあります-q。これはここでより良いオプションですが、すべてのコマンドに「静かな」スイッチがあるわけではありません。このような場合、>/dev/null以下の例に示すように使用できます。

具体的な例と$?

具体的に例をリクエストしました$?if grep ...上記の構成の代わりに、それを別々のステートメントに分割できます。

# grep -q "$1" $file would work just as well, here (better, maybe!):
grep "$1" $file >/dev/null

if [ $? -eq 0 ]; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

$?他のコマンド(一部のシェル組み込み機能を除く)を使用すると値が上書きされるため、問題のコマンドの直後にテストを実行する必要があることに注意することが重要です。

何ですか$?

$?シェルで実行された最後のプロセス(コマンド)の終了コード。慣例的に、0終了コードは成功を示します(ほとんどの慣例と同様に例外もあります)。より高い終了コードはさまざまなアプリケーション固有の意味を持つことができますが、通常ゼロ以外の値は、ある種の異常終了を示します。詳細については、このコマンドのマニュアルを参照してください。

追加読書

テスト(1)

答え2

if文も避けますが、とても素敵で短い(oneliner!)もう1つの簡単な方法は次$?のとおりです。

grep -q $name $file || echo "$name not found."

echo返品したい場合grep0

grep -q $name $file && echo "$name found."

そしてif-else-statemetのように:

grep -q $name $file && echo "$name found." || echo "$name not found."

関連情報