2011-02-08 16 views
0

私はbashスクリプトに慣れていません。私がやっている小さなプロジェクトに行くと、私は学びました。しかし、私は過去を過ごすことができないという問題にぶつかってきました。変数を使ったBashコマンドの置き換え

私はコマンドに含める必要がある変数を持っています。シェル内で直接実行された場合(手動で入力された変数を使用)、コマンドは予想される結果を返します。しかし、私はそれを変数を使用するときに動作させることはできません。

私はこれを手動で実行すると、実行中かどうかに応じて正しく0または1を返します。

ps -ef | grep -v grep | grep -c ProcessName 

私はこの間句にそのを埋め込むしようとすると、それが正しいテキストを探していないので、しかし、それは常に0に評価されます。

while [ `ps -ef | grep -v grep | grep -c {$1}` -ne 0 ] 
do 
    sleep 5 
done 

これを達成する方法はありますか?私は無駄に別のものを無数に試しました。私もコマンド置換のために$()の構文を使用してみましたが、私はそれにも運がありませんでした。

ありがとうございます!

+1

whileループのテストでは中カッコがありますが、あなたの例ではありません。 $ 1は正しい値を持っていますか? – Cascabel

+0

変数を示すためにそこに必要と思ったので、whileループに中カッコを入れました。それは間違っているかもしれませんが、それらを削除しても問題は解決しません。そして、はい、$ 1が正しい値を持っています。私はwhile文の直前に 'echo $ 1'を追加しました。それは正しいです。 – grt3kl

+0

中括弧を使用する必要がある場合は、ドル記号は最初の記号の前に置かれます。また、$ {1} "'を引用するのも良い考えです。便利な情報については、[プロセス管理](http://mywiki.wooledge.org/ProcessManagement)を参照してください。 –

答えて

3

私は{$1}の代わりに"$1"を意味すると思います。また、2つのパイプの代わりにpgrep -c "$1"を実行するだけで済みます。

さらに、grep -cの出力と0の出力を比較する必要はありません。コマンドが失敗したかどうかだけを確認できるからです。だから、多くの簡略版は次のようになります。あなたは完全なプロセス名を使用している場合

while pgrep "$1" > /dev/null 
do 
    sleep 4 
done 
+0

私は '{$ 1}'を '' '$ 1" 'に置き換えましたが、これはうまくいきません。私は何かを逃していないことを確認するためにこれを見ていきます... – grt3kl

+0

@ grt3kl:申し訳ありませんが、あなたが間違ってしようとしていることの感覚を持って - 私は今あなたが眠ろうとしていることを認識しています特定のプロセスが実行されている間、起動するまでスリープ状態にはなりません。だから、私は 'pgrep"を$ 1 "から' 'pgrep" $ 1 "'に変更しました。 –

+0

'pgrep" $ 1 ">/dev/null'は何を説明できますか?実際には、私は算術比較以外はそれを理解しています。反対のことをしたい場合(つまり、特定のプロセスが実行されていない間にスリープする)、それは 'pgrep" $ 1 "<=/dev/null'または全く違うものでしょうか? – grt3kl

1

あなたは本当にpsではなく、汚いパイプで-Cを使用する必要があります。部分文字列のマッチングに興味があるなら、あなたの方法は私が考えることができる唯一のものです。

関連する問題