プロセスが実行中かどうかを知りたいです。実行している場合は、スクリプトを呼び出すか、何かを印刷したいと思います。以下を試しましたが、構文エラーまたはコマンドが見つかりませんエラーが発生します。
APP_ID = ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java | awk '{print$2}'
if[''!= '${APP_ID}'] then
echo "Stopping instance $APP_ID"
私が得た結果は次のとおりです。
test.sh: line 15: APP_ID: command not found
test.sh: line 17: if[!= ${APP_ID}]: command not found
Stopping instance
上記のスクリプトにはどのような問題がありますか?エラーがある場合はecho
条件付きで印刷するのはなぜですかif
?
以下のスクリプトも失敗します。test.sh: line 3: [ps: command not found
if [ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java]; then
echo 'stop'
fi
ベストアンサー1
構文には多くの問題があります。
変数を設定するときは、「=」の周囲のスペースを削除してください。
無効:
APP_ID = value
正しい:
APP_ID=value
プログラムを実行し、その出力を変数に入れるには
$(...)
(bashで好み、shでは使用できません)、またはバックティック`command`
(bashとshでサポート)が必要です。 (変数を割り当てるときは引用符は必要ありませんが、他の場合は重要であることに注意してくださいcommand "$(command)"
。:)無効:
APP_ID=command
正しい:
APP_ID=$(command)
「[」を使用する場合は、すべての項目の周りにスペースを追加し、「]」の後にはセミコロンまたは改行文字が必要です。これは、「[」がbash組み込みコマンドであり、組み込みコマンドを「test」とも呼ばれ(参考資料を参照
man test
)、他のコマンドと同様に、引数がスペースで区切られているためです。無効:
if[x!= y] then echo hello world fi
正しい:
if [ x != y ]; then echo hello world; fi
変数を拡張するには、一重引用符の代わりに二重引用符を使用してください。
無効:
if [ '' != '${APP_ID}' ]; then
正しい:
if [ '' != "${APP_ID}" ]; then
また、上記の例では、空の文字列と比較する代わりに、-n(空ではない)を使用できます。
if [ -n "${APP_ID}" ]; then
psの例では、grepとawkは必要ありません。
APP_ID=$(ps -C whoami --no-header --format 'pid')
固定スクリプトは次のとおりです。
APP_ID=$(ps -C whoami --no-header --format 'pid')
if [ -n "${APP_ID}" ]; then
echo "Stopping instance $APP_ID"
fi