Bashスクリプトは特定のコマンドを実行しません

Bashスクリプトは特定のコマンドを実行しません

私が達成したいことの説明:

1)スクリプトが実行されたら、まずパッケージ名が「com.mixplorer」のファイルマネージャが有効になっていることを確認し、有効になっている場合は強制停止してからもう一度開き、それ以外の場合は開きます。

2)ファイルマネージャが開かれたので、ファイルマネージャプロセスの実行中にループから10秒ごとにLoopcleanerによって定義された「log.txt」というファイルを削除し続けます。

3)ファイルマネージャがアクティブになっていない場合にのみ、手順2のループクリーンアッププロセスを終了し、Success.txtというファイルを作成します。これですべてが完了したため、スクリプトが終了する可能性があります。

これは私のスクリプトです。

#!/bin/bash
PACKAGE='com.mixplorer'
if [ $(pidof $PACKAGE) ];
then
    am force-stop com.mixplorer && am start -n com.mixplorer/.activities.BrowseActivity; 
else 
    am start -n com.mixplorer/.activities.BrowseActivity;
fi

loopcleaner()
{
    rm -rf /sdcard/log.txt
}

while [ $(pidof $PACKAGE) ];
do
    loopcleaner;
    sleep 2;

    if [ ! $(pidof $PACKAGE) ];
    then
    break
        touch /sdcard/successful.txt
    fi
    exit 0;
done

以下はデバッグ出力です。スクリプトが途中で停止して実行されなかったことを明確に示しています。 パッケージがアクティブな間にループそして パッケージ以降のタッチコマンドは無効です。(明らかにトリガーする機会を与えるためにファイルマネージャを手動で閉じました)

$ su -c sh -x /sdcard/tester.sh
+ PACKAGE=com.mixplorer
+ pidof com.mixplorer
+ '[' ']'
+ pidof com.mixplorer
+ '[' ! ']'
+ am start -n com.mixplorer/.activities.BrowseActivity
Starting: Intent { cmp=com.mixplorer/.activities.BrowseActivity }
+ pidof com.mixplorer
+ '[' ']'
$

ベストアンサー1

主な問題は次のとおりです。if [ $(pidof "$package") ]

コマンドが実行するアクションは次のとおりです。

  • 解決"$package"、仮説foo
  • pidof foo空または「多分」出力を実行して維持します。
  • この出力をテストします。[ "blah" ]または[ ]

これはあなたが望むものではないかもしれません。

(コマンドの出力と戻りコードが間違っています。)

必要なのは(pidofパッケージが見つかったときに戻りコードがtrueの場合)

if pidof "$package"

または(pidofパッケージが見つかった場合は正の整数を返し、0パッケージが見つからない場合は正の整数を返します)

if [ $(pidof "$package") != 0 ]

または(pidofあなたの追跡によると、結果が見つからない場合は何も返されません)

if [ -n "$(pidof "$package")" ]
then (.. found ..)
else ( .. not found ... )
fi

以下にも適用されます。while

ちなみに、touchそれ以降は実行されませんbreak

おすすめ記事