ifを "and"で使用しようとした2回の試行が失敗しました。 if [ ... ] -a [ ... ] 、 if [[ ... && ... ]] なぜですか?

ifを "and"で使用しようとした2回の試行が失敗しました。 if [ ... ] -a [ ... ] 、 if [[ ... && ... ]] なぜですか?

Bashスクリプトで、パラメータにブール値(「true」または「false」)があることを確認したいと思います。
私はこれを2つのスクリプト、2つの異なる方法で試していますが、どちらも失敗します。
私は多くのStack Exchangeプロンプトをチェックし、それが私がしなければならないことをやっていると思いますが、そうではありません。

if [ "$2" != "true" ] -a [ "$2" != "false" ]; then
  echo "Indiquez si Geoserver est en installation initiale (false) ou update (true)" >&2;
  exit 1;
fi

メッセージで失敗Geoserver.sh: 12: [: true: unexpected operator

if [[ "$3" != "true" && "$3" != "false" ]]; then
  echo "Indiquez si Kafka est en installation initiale (false) ou update (true)" >&2;
  exit 1;
fi

失敗したKafka.sh: 18: [[: not found

答え1

標準的なアプローチは

[ "$3" != "true" ] && [ "$3" != "false" ]

つまり、2つの[コマンドが実行され、各コマンドはテストを実行し、&&シェルの演算子に関連付けられます。

[[...]]機能豊富な多くのシェルでサポートされているkshの特殊な非標準シェル構文で、通常は&&括弧をサポートしています。として構築されていないbash限りbash利用可能でなければなりません--disable-cond-commandが、エラーメッセージのフレーズによると、シェルを使用することをお勧めしますdashbashを使用してビルドすると、エラー--disable-cond-commandはとGeoserver.sh: 12: [: too many argumentsですKafka.sh: 18: [[: command not found

-a[以前のバージョンとの互換性のためにサポートされていますが、使用されなくなり、[ "$2" != "true" -a "$2" != "false" ]設計上破損しています(-o相手と同様)。または)を使用しないでください。

これは複雑です。

答え2

bashどちらのエラーもまったく使用せず、代わりにパフォーマンスが低下するシェルを使用していることを示しますdash

また、最初の例では、「and」句を誤って実装しました。

私はこれがあなたが望むものであり、本当に使用したい場合はうまくいくべきだと思いますbash

if [ "$2" != "true" -a "$2" != "false" ]; then

好ましい方法は、次の移植性の高いオプションである傾向があります。

if [ "$2" != "true" ] && [ "$2" != "false" ]; then

2番目の例のエラーは、対応する[[ ]]表記をサポートするシェルを使用していないことを示します。[ ] && [ ]上記のスタイル表記に変更すると、より多くの成功を収めることができます。

関連情報