Немедленное исправление заключается в перемещении символа канала после done
.
. Кроме того, вы должны перебрать "$@"
, чтобы сохранить в кавычках ваши аргументы, и, как правило, заключите в кавычки ваши переменные..
if [ $# -eq 0 ]
then
# print diagnostics to stderr
echo "Usage: phone searchfor [...searchfor]" >&2
echo "(You didn't tell me what you want to search for.)" >&2
exit 0
fi
for arg in "$@"
do
# Add missing dash before eq
if [ "$arg " -eq "$1" ]
then
# Surely you want "$arg" here, not the static string "arg"?
grep -E -i "$arg" mydata
else
grep -E -i "$arg"
fi
done |
awk -f display.awk
Общая логика все еще кажется ошибочной;вы будете использовать стандартный ввод для первого аргумента, если есть более двух аргументов.Возможно, вы хотите добавить опцию, позволяющую пользователю указать имя входного файла, с -
для указания стандартного ввода?И тогда все обычные аргументы будут строками поиска, как подсказывает сообщение об использовании.
Если на самом деле намерение состоит в том, чтобы перебрать все аргументы для создания логического И, попробуйте следующее:
also () {
local what
what=$1
shift
if [ $# -gt 0 ]; then
grep -E -i "$what" | also "$@"
else
grep -E -i "$what"
fi
}
also "$@" <mydata | awk -f display.awk
... хотя лучшей реализацией может быть создание простого сценария Awk или sed
из аргументов:
script='1'
for arg in "$@"; do
script="$script && tolower(\$0) ~ tolower(\"$arg\")"
done
awk "$script" | awk -f display.awk
Это ломается, если фразы для поиска могут содержать специальные выражения регулярных выражений (какие изКонечно, это верно и для версии grep -E
, но тогда вы можете легко переключиться на grep -F
).
Объединение двух сценариев Awk в один, вероятно, тоже не должно быть трудным, хотя без просмотра display.awk
это умозрительно.