条件が実行/動作しない場合のbashスクリプトの複数

条件が実行/動作しない場合のbashスクリプトの複数

そのアプリケーションビルドスクリプトをトリガーする入力ベースのbashスクリプトを作成しようとしています。入力が「all」の場合、すべてのアプリケーションが呼び出されます。ここで問題が発生します。入力が「all」の場合、app_1とapp_2のみが呼び出されます。何が問題になりますか?

if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_1" ]
then 
   echo "BUILD_STAGE APP_1 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_2" ]
then 
   echo "BUILD_STAGE APP_2 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_3" ]
then 
   echo "BUILD_STAGE APP_3 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_4" ]
then 
   echo "BUILD_STAGE APP_4 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_5" ]
then 
   echo "BUILD_STAGE APP_5 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_6" ]
then 
   echo "BUILD_STAGE APP_6 build started"
fi

ベストアンサー1

ここで提供したサンプルコードではこれは発生しません。おそらく、これらのechosは実行中のより複雑なタスクのプレースホルダーにすぎず、私の考えでは、タスクは実際にapp_2値を変更するようです$_BUILD_MODE

ここでは、次のことができます。

case $_BUILD_MODE in
  (all | app_1) task for app_1 ;;&
  (all | app_2) task for app_2 ;;&
  (all | app_3) task for app_3 ;;&
  ...
esac

これにより、長さが短くてきれいになり、$_BUILD_MODE最初に一度だけ逆参照されるため、この特定の問題も回避できます。

;;&上記は bash にのみ適用されます。 zshとmkshの同等の構文はwithです;|。 zsh、mksh、およびbashのサポート;;(唯一の標準シェルであるBourneシェルから)および;& (Kornシェルから)。

app_2アクションを呼び出すexitか、exec some-other-command致命的なエラーが発生したり、シェルプロセスが終了する可能性があります。この問題の解決策は、サブシェルを(...)

bash -o xtrace(same as)を使用してスクリプトを実行し、bash -x何が起こっているかを確認してください。


1たとえば、組み込み機能が破損したパイプに書き込まれる場合はSIGPIPEを介して、特定のリソース制限を超えた場合はSIGXCPUを介して...

おすすめ記事