Используя 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).