#!/bin/ksh
if [ -n "$1" ]
then
if grep -w -- "$1" codelist.lst
then
true
else
echo "Value not Found"
fi
else
echo "Please enter a valid input"
fi
Это мой сценарий, и он работает именно так, как я хочу в данный момент, я хочу добавить, если добавлю больше аргументов. Это даст мне несколько выходов. Как я могу это сделать?
Итак, например, я делаю ./test.sh apple, он будет искать яблоко в codelist.lst и даст мне вывод: Apple
Я хочу сделать ./test.sh apple orange и сделаю: Яблоко Апельсин
Вы можете сделать это с помощью shift
и цикла, например (работает как в bash
, так и в ksh
):
for ((i = $#; i > 0 ; i--)) ; do
echo "Processing '$1'"
shift
done
Вы заметите, что я также выбрал нет для использования метода [[ -n "$1" ]]
, так как это приведет к преждевременному завершению цикла с пустой строкой (например, с остановкой ./script.sh a b "" c
без выполнения c
).
@ user1543961, вы можете проверить $#
на ноль перед входом в цикл for. Но я вижу, вы задали это как отдельный вопрос, поэтому я пойду и отвечу на него там :-)
Чтобы перебрать позиционные параметры:
for pattern in "$@"; do
grep -w -- "$pattern" codelist.lst || echo "'$pattern' not Found"
done
Для более сложного использования, при котором grep вызывается только один раз, используйте параметр -f
с заменой процесса оболочки:
grep -w -f <(printf '%s\n' "$@") codelist.lst
Вам не нужно -f <(...)
; аргумент grep может быть несколькими шаблонами, разделенными новой строкой grep -we "$(printf '%s\n' "$@")"
или более хитро IFS=$'\n'; grep -we "$*"
Можно ли совместить if и for вместе? как это в моем сценарии? Если значение найдено = эхо-значение, Если ничего не вставлено в качестве аргумента, Пожалуйста, вставьте значение, Если значение не найдено, эхо-значение не найдено Я сделал это: for ((i = $#; i > 0; i--)) ; do grep -w -- "$1" codelist.lst || echo "'$1' not found" смена выполнена Но как мне поступить иначе echo "Пожалуйста, введите значение"