मैं बैश केस स्टेटमेंट में खाली स्ट्रिंग के लिए परीक्षण कैसे कर सकता हूं?


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}माध्यम से गिर जाता है *

क्या मैं असंभव को करने की कोशिश कर रहा हूं?


आदेश कैसे प्रदान किया जा रहा है? स्टड के माध्यम से?
ओक

जवाबों:


128

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

अगर मैं एक सबरूटीन की खोज कर रहा हूं जो एक फाइल सिस्टम में एक या दो फाइलों में मौजूद है जिसमें दर्जनों cgi फाइलें हैं जो मैं खोज शब्द दर्ज करता हूं, जैसे 'ssn_format'। बैश मुझे एक पाठ फ़ाइल में परिणाम वापस देता है (खोजक। txt) जो इस तरह दिखता है:

- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format ($ user, $ script_name, $ Local, $ Local, $ ssn) यदि $ ssn ne "";

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