bash: परीक्षण यदि $ WORD सेट में है


54

मैं एक निर्माण की तलाश कर रहा हूं bash, यह तय करने के लिए कि क्या एक चर $WORDपरिभाषित शब्दों में से एक है। मुझे कुछ ऐसा ही चाहिए:

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

क्या बाश में इस तरह के निर्माण हैं? यदि नहीं, तो निकटतम क्या होगा?

जवाबों:


57

यह एक बैश-ओनली (> = संस्करण 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अगर आप खोज को असंवेदनशील बनाना चाहते हैं तो मदद कर सकते हैं।
स्किप्पी ले ग्रांड गौरौ

1
ध्यान दें कि आपको उपयोग करना है [[और ]]- [और ]पर्याप्त नहीं हैं।
ग्रेग डबिकि

मैं अपने स्क्रिप्ट तर्क को मान्य करने के लिए एक 'ऑन्लाइनर' की खोज कर रहा था, और यह पूरी तरह से काम करता था। धन्यवाद! [[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
आरएएसजी


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[@]}
terdon

आंशिक शब्दों से बचने के लिए बस -w को grep में जोड़ें
BrenoZan

1

आप इसके लिए एक बश फ़ंक्शन को परिभाषित कर सकते हैं:

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पैटर्न की अनुमति के लिए एक पैटर्न निर्दिष्ट करता है।

fgrepgrep का संस्करण है जो रेगेक्स मिलान के बजाय सामान्य स्ट्रिंग मिलान करता है। यदि आपके पास है grep, तो आपके पास होना चाहिए fgrep, लेकिन यदि नहीं है, तो यह ध्वज के grepसाथ उपयोग करने के समान है -F(इसलिए आप बस fgrep -wqइसके साथ ऊपर प्रतिस्थापित करेंगे grep -Fwq)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.