シェルスクリプトのwhileループ

シェルスクリプトのwhileループ

count コマンドを実行できますが、while 条件内で使用するとエラーが発生します。

-bash: [/usr/bin/ps -aef|/usr/bin/egrep 'catalina|java|wrapper-linux-x86-64'|/usr/bin/grep -v 'catalina|java|wrapper-linux-x86-64'|wc -l: No such file or directory.


count="/usr/bin/ps -aef|/usr/bin/egrep 'catalina|java|wrapper-linux-x86- 
64'|/usr/bin/grep -v 'catalina|java|wrapper-linux-x86-64'|wc -l"
while [ "$count" -ne 0 ]
do
echo "killing services and tomcat process"
/usr/bin/ps -aef|/usr/bin/egrep "catalina|java|wrapper-linux-x86- 
64"|/usr/bin/grep -v "catalina|java"|/usr/bin/awk '{print 
$2}'|/usr/bin/xargs kill -9
sleep 10
count="/usr/bin/ps -aef|/usr/bin/egrep 'catalina|java|wrapper-linux-x86- 
64'|/usr/bin/grep -v 'catalina|java|wrapper-linux-x86-64'|wc -l"

done;

ベストアンサー1

count="/usr/bin/ps -aef|...|wc -l"

変数にコマンドを保存しないでください。変数はそのために設計されておらず、保存されたコマンドで作業することは困難です。コマンドをどこかに保存するには、次の関数を使用します。

count_procs() {
    /usr/bin/ps -aef|...|wc -l
}

関数は他のコマンドのように使用できます。

表示されるコードは、対応するcount文字列の値を整数ゼロと比較します。 Bashは[数値以外の値について文句を言います。

発生したエラーは、同様のコマンド(["$count" -eq 0 ]および間にスペースがない)で発生する可能性があります。これは、その内容が連結され、実行されるコマンドの名前であるコマンドラインの最初の単語を形成するためです。これは愚かですが、括弧、パイプ文字、スペースを含むパスを持つことは完全に可能です。[$countcount[

さて、実際にコマンドを実行し、その出力をキャプチャしてゼロと比較したいと仮定すると、コマンド置換を使用する必要があります$(...)

result=$(ps ... |wc -l)            # save the output of the command to `result`

または

[ "$(ps ... | wc -l)" -eq 0 ] ... # use the command output directly in a test

ループが実行されるたびにプロセス数を計算するには、ループ本体内でコマンドを実行する必要があります。例えば

while [ "$(ps ... | wc -l)" -eq 0 ]; do
    ...
done

または関数を使用してください。

count_procs() {
    /usr/bin/ps -aef|...|wc -l
}
while [ "$(count_procs)" -eq 0 ]; do
    ...
done  

ループの前にプロセスを一度だけ計算すると、条件は一定になり、ループは無限に繰り返されるかまったく繰り返されません。

おすすめ記事