web-dev-qa-db-ja.com

インラインifシェルスクリプト

このようなコマンドラインでシェルスクリプトを実行することは可能ですか?

_counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ] then; echo "true";
>
_

上記の例は機能していません_>_文字のみを取得しようとしても、取得しようとしている結果は「true」ではありません

_ps -ef | grep -c "myApplication_を実行すると、1つの出力が得られます。スクリプトの単一行から結果を作成することは可能ですか?ありがとうございました

32
London

fiステートメントを終了するためにifを逃したため、機能しません。

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi

以下を使用してさらに短縮できます。

if [ $(ps -ef | grep -c "myApplication") -eq 1 ]; then echo "true"; fi

また、 @ DigitalRoss 'answer で説明されているように、ps -ef | grep ...自体の一致の問題にも注意してください。

更新

実際、pgrepを使用することで、より適切に行うことができます。

if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi
56
Shawn Chin

はい、構文の問題が修正されました

ほぼ動作しました。正しい構文は次のとおりです。

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi

しかし、psgrepを含むこの種の式では、「grep -c Myapplication」という文字がpsリストに表示されるため、grepは通常一致します。 。それを回避する方法はいくつかありますが、そのうちの1つは、[M]yapplication

6
DigitalRoss

他の応答は構文エラーに対処していますが、行を次のように変更することを強くお勧めします。

 test $(ps -ef | grep -c myApplication)-eq 1 && echo true 

オカレンスの数を厳密に1に制限しようとしていない場合(たとえば、単に出力行myApplicationを確認しようとして、2回以上表示されないことが予想される場合)、次のようにします。

 ps -ef | grep myApplication>/dev/null && echo true 

(後で処理するために変数カウンターを設定する必要がある場合、これらのソリューションはどちらも適切ではありません。)

短絡した&&および||を使用する演算子は、特にワンライナーでif/then構造を埋め込むよりもはるかに明確であることがよくあります。

5
William Pursell

私はMac OSを使用していますが、以下は非常にうまくいきました

$ counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true";fi;

本当

[前後]スペースが必要です

1
minhas23

私は、コマンドに複数の行フィードを結合し、その結果を変数(ファイルではなく)に取得してこの解決策を考え出すのに苦労しました:

    FRA_PARAM="'db_recovery_file_dest'"
    FRA=$(
    sqlplus -S "/as sysdba" <<EOF
set echo off head off feed off newpage none pages 1000 lines 1000
select value from v\$parameter where name=$FRA_PARAM;
exit;
EOF
        )

それ以外の場合は二重引用符への自動置換を受け取っていたため、単一引用符のWordが置換されたことに注意してください... ksh、HP-UX。

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

0
Tagar