bash: перевірити, чи встановлено $ WORD


54

Я шукаю конструкцію bash, щоб вирішити, чи є змінна $WORDодним із визначених слів. Мені потрібно щось подібне:

if "$WORD" in dog cat horse ; then 
    echo yes
else
    echo no
fi

Баш має таку конструкцію? Якби ні, що було б найближчим?

Відповіді:


57

Це рішення лише для 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 за те, що він нагадав мені належним чином прив’язати шаблон до ^та $.


1
І shopt -s nocasematchможе допомогти, якщо ви хочете, щоб пошук не враховував регістр.
Skippy le Grand Gourou

1
Зауважте, що вам доведеться використовувати [[і ]]- [і ]їх недостатньо.
Грег Дубіцький

Я шукав 'oneliner', щоб перевірити мій аргумент сценарію, і це спрацювало чудово. спасибі! [[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
RASG


11

Як щодо:

#!/usr/bin/env bash

WORD="$1"
for w in dog cat horse
do
  if [ "$w" == "$WORD" ] 
  then
      yes=1
      break
  fi
done;
[ "$yes" == "1" ] && echo "$WORD is in the list" || 
                     echo "$WORD is not in the list"

Тоді:

$ a.sh cat
cat is in the list
$ a.sh bob
bob is not in the list

3
if (echo "$set"  | fgrep -q "$WORD")

1
Обережно, це повертає істину , якщо $WORDпорожньо, він буде відповідати , якщо WORD=caабо WORD=ogабо подібним , і я припускаю , що ви мали в виду echo ${set[@]}.
тердон

просто додайте -w до грепу, щоб уникнути часткових слів
BrenoZan

1

Ви можете визначити функцію bash для цього:

function word_valid() 
{ 
  if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then
    echo no
  else
    echo yes
  fi
}

Тоді використовуйте просто так:

word_valid cat

1

Я шукав рішення "в один рядок", щоб перевірити мій аргумент сценарію, і використав відповідь Джозефа Р., щоб придумати:

[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }


0

Це працювало для мене:

#!/bin/bash
phrase=(cat dog parrot cow horse)
findthis=parrot

for item in ${phrase[*]}
do
    test "$item" == "$findthis" && { echo "$findthis found!"; break; }
done

0

Ви можете поставити список слів у файл, якщо ви часто змінюєте список, або ви хочете, щоб він ділився кількома сценаріями. І вам може знадобитися ввести слова у файл, якщо список стає занадто довгим для управління в сценарії. Тоді ви можете сказати

if fgrep qx "$WORD" word_list

ні, я не хочу, щоб мій список був у файлі
Мартін Вегтер,

0

Якщо слова - це список, де значення розділені новим рядком, ви можете зробити:

WORDS="$(ls -1)"
if echo "${WORDS}" | grep --quiet --line-regexp --fixed-strings "${WORD}"; then
    echo yes
else
    echo no
fi

0

Ви можете використовувати 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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.