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
そうは言っても、 ?の戻りコードをチェックする方が効率的かもしれません。
(*) これはファイル名に対して行われるのと同じ基本的なパターン マッチングです。=~
正規表現を受け入れる論理演算子もあります。