bash: test se $ WORD está no set

40

Estou procurando uma construção em bash , para decidir se uma variável $WORD é uma das palavras definidas. Eu preciso de algo assim:

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

o bash tem essa construção? Se não, qual seria o mais próximo?

    
por Martin Vegter 29.01.2014 / 18:45

10 respostas

40

Esta é uma solução somente Bash (> = versão 3) que usa expressões regulares:

if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

Se a sua lista de palavras for longa, você pode armazená-la em um arquivo (uma palavra por linha) e fazer isso:

if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

Uma ressalva com a abordagem de arquivos:

  • Ele será quebrado se o arquivo tiver espaço em branco. Isso pode ser remediado por algo como:

    sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin
    

Obrigado ao @terdon por me lembrar de ancorar corretamente o padrão com ^ e $ .

    
por 29.01.2014 / 19:19
60
case $word in
    dog|cat|horse) echo yes;;
    *)             echo no;;
esac
    
por 30.01.2014 / 00:26
10

Que tal:

#!/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"

Então:

$ a.sh cat
cat is in the list
$ a.sh bob
bob is not in the list
    
por 29.01.2014 / 19:13
3
if (echo "$set"  | fgrep -q "$WORD")
    
por 29.01.2014 / 19:18
1

Você pode definir uma função bash para isso:

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

Em seguida, use simplesmente assim:

word_valid cat
    
por 29.01.2014 / 18:55
1

Eu estava procurando uma solução de 'uma linha' para validar meu argumento de script e usei resposta de Joseph R. acima para apresentar:

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

    
por 17.05.2017 / 13:26
0

Isso funcionou para mim:

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

for item in ${phrase[*]}
do
    test "$item" == "$findthis" && { echo "$findthis found!"; break; }
done
    
por 29.01.2014 / 21:20
0

Você pode querer colocar a lista de palavras em um arquivo, no caso de você mudar a lista com freqüência, ou você quer que ela seja compartilhada por vários scripts. E você pode precisar colocar as palavras em um arquivo se a lista ficar muito longa para gerenciar em um script. Então você pode dizer

if fgrep –qx "$WORD" word_list
    
por 30.01.2014 / 00:54
0

Se as palavras forem uma lista em que os valores são separados por uma nova linha, você pode fazer:

WORDS="$(ls -1)"
if echo "${WORDS}" | grep --quiet --line-regexp --fixed-strings "${WORD}"; then
    echo yes
else
    echo no
fi
    
por 01.05.2016 / 23:34
0

Você pode usar o fgrep para especificar todas as palavras permitidas:

if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then 
    echo yes
else
    echo no
fi

O sinalizador -w corresponde apenas a palavras completas, o sinalizador -q o faz operar silenciosamente (porque tudo o que precisamos é o valor de retorno para a instrução if usar) e cada padrão -e especifica um padrão para permitir .

fgrep é a versão do grep que faz a correspondência de string normal em vez da correspondência de regex. Se você tiver grep , deverá ter fgrep , mas se não tiver, será idêntico ao uso de grep com o sinal -F (para substituir apenas fgrep -wq acima por grep -Fwq ).

    
por 07.08.2018 / 21:11