Назад | Перейти на главную страницу

используя 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», но второе «эхо» ничего не печатает, и, конечно, if тоже не работает.

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

TIA,

Боб

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это предложение, поскольку оно не требует создания отдельного процесса.

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

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

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