Скрипт оболочки не может проанализировать строку в операторе 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?

(*) Это то же самое базовое сопоставление с шаблоном, которое выполняется для имен файлов. Также есть логический оператор, =~который принимает регулярное выражение.

Связанный контент