2016-06-29 6 views
0

Javaスタイルのプロパティファイルからプロパティ値を返す次のBash関数があります。プロパティーが見つかりませんでした。ゼロ以外の値を返します。見つかった場合、プロパティの値は&の戻りコードがゼロでなければなりません。リターンコードと出力を維持しながら、外部ユーティリティ(grep)を2回呼び出すことを避けるにはどうすればよいですか?

function property_get() { 
    local pfile="$1" 
    local pname="$2" 
    if egrep "^${pname}=" "$pfile" 2>&1 >/dev/null; then 
     local line="$(egrep "^${pname}=" "$pfile")" 
     printf "${line#*=}" 
     return 0 # success 
    else 
     return 1 # property not found 
    fi 
} 

質問:どのようにしてegrepを2回呼び出すことを避けるのですか?最初のexecはステータスコード、2番目はプロパティ値です。 $(grep parameters)表記を使用すると、grepがサブシェルで起動され、戻りコードが取得できず、プロパティ検索の成功または失敗を判断できなくなります。

+1

理由だけではなく、行を取得し、ないここで説明したように、$?0あるlocalの終了ステータスに設定されますlocal var=$(cmd)

  • それが見つかったかどうか確認しますか? – matt

  • +0

    @mattは私の間接的なチェックのようです。 grepはすでにリターンコードを提供して成功または失敗を報告しています。私はその事実を利用したいと思っています。 –

    +1

    「終了ステータスの確認方法」(http://linuxcommando.blogspot。 co.uk/2008/03/how-to-check-exit-status-code.html)? – matt

    答えて

    0

    @mattが指摘するように、あなたは自分のコマンドの終了ステータスをチェックして、行を取得することができます。

    line=$(...) 
    if test $? -eq 0; then 
        # success 
        ... 
    else 
        # property not found 
        ... 
    fi 
    

    編集:

    を要約すると:

    2

    をこれは動作するはずです::

    ... 
    local line 
    if line=$(egrep "^${pname}=" "$pfile" 2>/dev/null); then 
    ... 
    
    関連する問題