Я делаю сценарий, в котором мне нужно протестировать строку, и по ее результату я решу, пойду я дальше или нет.
Приведенная ниже команда работает нормально (если строка начинается с «Очистить», выводится 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).