bash: $ WORD ayarlanmışsa test edin


54

bashBir değişkenin $WORDtanımlanmış kelimelerden biri olup olmadığına karar vermek için bir yapı arıyorum . Bunun gibi bir şeye ihtiyacım var:

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

bash'ın böyle bir yapısı var mı? Olmazsa, en yakın ne olurdu?

Yanıtlar:


57

Bu, düzenli ifadeleri kullanan salt Bash (> = sürüm 3) çözümüdür:

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

Kelime listeniz uzunsa, bir dosyada saklayabilirsiniz (satır başına bir kelime) ve şunu yapın:

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

Dosya yaklaşımı ile bir uyarı:

  • Dosyada boşluk varsa kırılır. Bu, şöyle bir şey tarafından giderilebilir:

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

Teşekkür düzgün ile desen demirlemek için hatırlattığın için @terdon için ^ve $.


1
Ve shopt -s nocasematcharama harf duyarsız olmasını istiyorsanız yardımcı olabilir.
Skippy le Grand Gourou

1
Kullanmak zorunda olduğunu unutmayın [[ve ]]- [ve ]yeterli değildir.
Greg Dubicki

senaryo argümanımı doğrulamak için bir 'oneliner' arıyordum ve bu mükemmel çalıştı. teşekkür ederim! [[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
RASG


11

Peki ya:

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

Sonra:

$ 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
Dikkatli olsa da, eğer $WORDbu boşsa doğru dönecek , eğer WORD=caya WORD=ogda benzerleriyle eşleşecek ve sizi kastediyoruz echo ${set[@]}.
terdon

kısmi kelimelerden kaçınmak için grep
komutuna

1

Bunun için bir bash işlevi tanımlayabilirsiniz:

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

O zaman sadece böyle kullanın:

word_valid cat

1

senaryo argümanımı doğrulamak için bir 'tek satır' çözümü arıyordum ve yukarıdakileri bulmak için yukarıdaki Joseph R. cevabını kullandım :

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


0

Bu benim için çalıştı:

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

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

0

Listeyi sık sık değiştirmek durumunda kelimelerin listesini bir dosyaya koymak veya birden çok komut dosyasıyla paylaşılmasını isteyebilirsiniz. Listede bir komut dosyasında yönetimi çok uzun sürerse, kelimeleri bir dosyaya koymanız gerekebilir. O zaman söyleyebilirsin

if fgrep qx "$WORD" word_list

hayır,
listemin

0

Kelimeler, değerlerin yeni satır ile ayrıldığı bir liste ise, şunları yapabilirsiniz:

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

0

İzin verilen tüm kelimeleri belirtmek için fgrep kullanabilirsiniz:

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

-wBayrak, sadece tam kelimelerle eşleşen -qbayrak sessizce çalışır yapar (tek ihtiyacımız için dönüş değer olduğundan deyimi kullanmak ise) ve her -edeseni izin vermek için bir kalıp.

fgrepgrge'nin, regex eşleşmesi yerine normal dize eşleşmesini yapan sürümüdür. Eğer sahipseniz, sahip grepolmalısınız fgrep, ama olmasaydı grep, -Fbayrakla kullanmakla aynıdır (bu yüzden fgrep -wqyukarıdakiyle değiştirirsiniz grep -Fwq).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.