Используя awk в скрипте bash с if

Я делаю сценарий, в котором мне нужно проверить строку, и на основе ее результата я решу, идти дальше или нет.

Команда ниже работает нормально (если строка начинается с "Очистить", она выведет 1, иначе 0).

echo | awk ' {print index("'"${task}"'", "Clean")}'

Я пытаюсь использовать AWK с IF в сценарии BASH. На основании этого поста я сделал следующее:

idx=$(awk '{print index("'"${task}"'", "Clean")}')
echo $idx
if [ "$idx" == "0" ]; then
   echo hello
fi

Как я уже сказал, когда я запускаю скрипт, он печатает "0", но второе "echo" ничего не печатает, и, конечно, if не работает.

Может кто-нибудь мне помочь?

ТИА,

боб

3 ответа

Решение

Awk - неправильное решение здесь. Как насчет:

if [[ "$task" =~ ^Clean ]]; then
  echo hello
fi

Есть также хитрый метод замещения:

if [ "${task/#Clean/}" != "$task" ]; then
  echo hello
fi

Но я считаю, что это гораздо менее читабельно.


Крис считает, что дело аккуратнее... давайте попробуем это:

case $task in
  Clean*)
    echo hello
    ;;
esac

Мое эстетическое чувство гласит "черт возьми с колокольчиками" и возится с форматированием (Clean*) echo hello;; или похожее) не сильно поможет, IMAO. Если вы хотите условное, используйте if, Я говорю.

В первом примере вы используете echo предоставлять awk с файлом (stdin), но в вашем скрипте нет файла для awk обрабатывать и "зависает" в ожидании ввода. Вы могли бы использовать echo в вашем назначении переменной в $(), но я предпочитаю использовать /dev/null для этой цели (то есть, когда нет фактического файла для обработки).

Чтобы избежать неловкого цитирования, вы можете использовать переменную, передавая -v возможность предоставить переменные Bash для awk скрипт.

Вы должны найти, что это работает:

idx=$(awk -v task="$task" '{print index(task, "Clean")}' /dev/null)
echo $idx
if [ "$idx" == "0" ]; then
   echo hello
fi

Вы, вероятно, должны использовать предложение womble, так как оно не требует порождения отдельного процесса.

Ответ Womble, вероятно, то, что я хотел бы, но вы также можете использовать grep:

if echo cleanarf | grep -qi '^clean'; then 
   echo foo
fi

Брось i переключитесь на grep, если вы хотите, чтобы он чувствителен к регистру (или если вы не хотите, чтобы он чувствителен к регистру:-p).

Другие вопросы по тегам