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