シェルスクリプトはifステートメントの下の文字列を解析できません。

シェルスクリプトはifステートメントの下の文字列を解析できません。

make some_targetが存在するかどうかを見つけるための簡単なスクリプトがあります。存在しない場合は、文を印刷して1で終了します。

#!/bin/bash
set +ex
output=$(make -n some_target 2>&1 | head -1)
echo "$output"
if [ "$output" == "*No rule to make target*" ]; then
  echo "Target is not Present"
  exit 1
else
  echo "foo"  
fi

しかし、エラーが発生してelseループに入ります。

make: *** No rule to make target 'some_target'.  Stop.
test.sh: 5: [: make: *** No rule to make target 'some_target'.  Stop.: unexpected operato                                                                                                  
foo

答え1

以下で答えを見つけることができました。

#!/bin/sh
set +ex 
if make -n some_target 2>&1 | grep -m 1 "No rule to make target"; then
        echo "Target is not Present"
        exit 1
else
        echo "foo"
fi

答え2

パターンマッチング(*)は次のように実行できます。bash論理演算子 ==、、、ここで右のオペランドはパターンと見なされます=!=したがって、条件を作成できます。

if [[ $output == *'No rule to make target'* ]]

回答にが含まれていることを確認してくださいNo rule to make target

つまり、make? の戻りコードを確認する方が効率的です。

(*) ファイル名の基本パターンマッチングと同じです。=~正規表現を取る論理演算子もあります。

関連情報