bash: $ WORD সেট করা থাকলে পরীক্ষা করুন set


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


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[@]}
টেরডন

আংশিক শব্দ এড়ানোর জন্য
গ্রেপ-এ

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

আপনি যদি তালিকাটি প্রায়শই পরিবর্তন করেন, বা আপনি এটি একাধিক স্ক্রিপ্ট দ্বারা ভাগ করে নিতে চান তবে আপনি একটি ফাইলের মধ্যে শব্দের তালিকাটি রাখতে চান put তালিকাটি যদি কোনও স্ক্রিপ্টে পরিচালনা করতে খুব দীর্ঘ হয় তবে আপনার ফাইলগুলিতে একটি শব্দ লিখতে হবে। তাহলে আপনি বলতে পারেন

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আপনার থাকা উচিত fgrep, তবে তা না থাকলে এটি পতাকা grepসহ ব্যবহার করার অনুরূপ -F(যাতে আপনি কেবল fgrep -wqউপরের সাথে প্রতিস্থাপন করবেন grep -Fwq)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.