$?
私はスクリプトに初めてアクセスし、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:
出力されます。stderr
1>&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
終了コードは成功を示します(ほとんどの慣例と同様に例外もあります)。より高い終了コードはさまざまなアプリケーション固有の意味を持つことができますが、通常ゼロ以外の値は、ある種の異常終了を示します。詳細については、このコマンドのマニュアルを参照してください。
追加読書
答え2
if文も避けますが、とても素敵で短い(oneliner!)もう1つの簡単な方法は次$?
のとおりです。
grep -q $name $file || echo "$name not found."
echo
返品したい場合grep
:0
grep -q $name $file && echo "$name found."
そしてif-else-statemetのように:
grep -q $name $file && echo "$name found." || echo "$name not found."