আমি বাশ কেস স্টেটমেন্টে খালি স্ট্রিংয়ের জন্য কীভাবে পরীক্ষা করব?


87

আমার একটি বাশ স্ক্রিপ্ট রয়েছে যা ভেরিয়েবলের মানের উপর ভিত্তি করে ক্রিয়া সম্পাদন করে। কেস স্টেটমেন্টের সাধারণ বাক্য গঠন:

case ${command} in
   start)  do_start ;;
   stop)   do_stop ;;
   config) do_config ;;
   *)      do_help ;;
esac

আমি কোনও কমান্ড সরবরাহ না করা এবং do_helpকমান্ডটি স্বীকৃত না হলে ডিফল্ট রুটিন সম্পাদন করতে চাই । আমি মামলার মানটি বাদ দেওয়ার চেষ্টা করেছি:

case ${command} in
   )       do_default ;;
   ...
   *)      do_help ;;
esac

ফলাফল অনুমানযোগ্য ছিল, আমার ধারণা:

syntax error near unexpected token `)'

তারপরে আমি একটি রেজেক্স ব্যবহার করার চেষ্টা করেছি:

case ${command} in
   ^$)     do_default ;;
   ...
   *)      do_help ;;
esac

এই সঙ্গে, একটি খালি ${command}মাধ্যমে বৃক্ষের পতন *কেস।

আমি কি অসম্ভবকে চেষ্টা করে যাচ্ছি?


কমান্ডটি কীভাবে সরবরাহ করা হচ্ছে? স্টিডিনের মাধ্যমে?
ওক

উত্তর:


129

caseবিবৃতি globs না regexes ব্যবহার করে এবং সঠিক মিল উপর জোর দিচ্ছে।

তাই খালি স্ট্রিংটি যথারীতি লিখিত হয় ""বা '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac

একটি নোট হিসাবে, একাধিক পছন্দ ব্যবহার করার সময় এটি কাজ করে:something|'') do_something ;;
yolenoyer

4

আমি একটি সাধারণ পতন মাধ্যমে ব্যবহার। পাস করা কোনও প্যারামিটার ($ 1 = "") দ্বিতীয় কেস স্টেটমেন্টের দ্বারা ধরা পড়বে না, তবুও নিম্নলিখিতটি * কোনও অজানা প্যারামিটার ধরবে। "") এবং *) উল্টিয়ে দেওয়া * * এর মতো কাজ করবে না) সেই ক্ষেত্রে প্রতিবার সবকিছু খালি এমনকি ফাঁকা হয়ে যাবে।

#!/usr/local/bin/bash
# testcase.sh
case "$1" in
  abc)
    echo "this $1 word was seen."
    ;;
  "") 
    echo "no $1 word at all was seen."
    ;;
  *)
    echo "any $1 word was seen."
    ;;
esac

1

আমি এটি কীভাবে করব (প্রত্যেকটির নিজস্ব):

#!/bin/sh

echo -en "Enter string: "
read string
> finder.txt
echo "--" >> finder.txt

for file in `find . -name '*cgi'`

do

x=`grep -i -e "$string" $file`

case $x in
"" )
     echo "Skipping $file";
;;
*)
     echo "$file: " >> finder.txt
     echo "$x" >> finder.txt
     echo "--" >> finder.txt
;;
esac

done

more finder.txt

যদি আমি এমন একটি সাবরুটিন অনুসন্ধান করি যা কয়েক ডজন সিজি ফাইল যুক্ত ফাইল সিস্টেমে এক বা দুটি ফাইলে বিদ্যমান থাকে তবে আমি অনুসন্ধান শব্দটি প্রবেশ করি, যেমন 'ssn_format'। বাশ আমাকে টেক্সট ফাইলে ফলাফলগুলি ফিরিয়ে দেয় (Finder.txt) যা দেখতে এরকম দেখাচ্ছে:

-।

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