Я шукаю конструкцію bash
, щоб вирішити, чи є змінна $WORD
одним із визначених слів. Мені потрібно щось подібне:
if "$WORD" in dog cat horse ; then
echo yes
else
echo no
fi
Баш має таку конструкцію? Якби ні, що було б найближчим?
Я шукаю конструкцію bash
, щоб вирішити, чи є змінна $WORD
одним із визначених слів. Мені потрібно щось подібне:
if "$WORD" in dog cat horse ; then
echo yes
else
echo no
fi
Баш має таку конструкцію? Якби ні, що було б найближчим?
Відповіді:
Це рішення лише для Bash (> = версія 3), яке використовує регулярні вирази:
if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
Якщо ваш список слів довгий, ви можете зберегти його у файлі (одне слово на рядок) і зробити це:
if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
echo "$WORD is in the list"
else
echo "$WORD is not in the list"
fi
Один застереження з файловим підходом:
Він зламається, якщо у файлу є пробіл. Це можна усунути чимось на кшталт:
sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin
Дякуємо @terdon за те, що він нагадав мені належним чином прив’язати шаблон до ^
та $
.
[[
і ]]
- [
і ]
їх недостатньо.
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
case $word in
dog|cat|horse) echo yes;;
*) echo no;;
esac
Ви можете визначити функцію bash для цього:
function word_valid()
{
if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then
echo no
else
echo yes
fi
}
Тоді використовуйте просто так:
word_valid cat
Я шукав рішення "в один рядок", щоб перевірити мій аргумент сценарію, і використав відповідь Джозефа Р., щоб придумати:
[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
Ви можете поставити список слів у файл, якщо ви часто змінюєте список, або ви хочете, щоб він ділився кількома сценаріями. І вам може знадобитися ввести слова у файл, якщо список стає занадто довгим для управління в сценарії. Тоді ви можете сказати
if fgrep –qx "$WORD" word_list
Ви можете використовувати fgrep, щоб вказати всі дозволені слова:
if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then
echo yes
else
echo no
fi
-w
Прапор відповідає тільки повним словами, то -q
прапор дозволяє працювати тихо (бо все , що потрібно це значення, що повертається для якщо заяву використовувати), і кожен -e
шаблон задає шаблон , щоб дозволити.
fgrep
це версія grep, яка робить звичайну відповідність рядків замість регулярного вирівнювання. Якщо у вас є grep
, ви повинні мати fgrep
, але якщо ні, то це ідентично використанню grep
з -F
прапором (так що ви просто заміните fgrep -wq
вище на grep -Fwq
).
shopt -s nocasematch
може допомогти, якщо ви хочете, щоб пошук не враховував регістр.