it-swarm.asia

كيف يمكنني اختبار لسلسلة فارغة في بيان حالة Bash؟

لدي برنامج نصي Bash يقوم بتنفيذ إجراءات بناءً على قيمة المتغير. بناء الجملة العام لبيان الحالة هو:

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

أرغب في تنفيذ روتين افتراضي في حالة عدم توفر أي أمر ، وإجراء المساعدة إذا لم يتم التعرف على الأمر. حاولت حذف قيمة الحالة على هذا النحو:

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

النتيجة كانت متوقعة ، أفترض:

syntax error near unexpected token `)'

ثم حاولت استخدام أفضل لقطة لدي في لعبة regex:

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

بهذا ، يقع $ {command} الفارغ في حالة *.

هل أحاول أن أفعل المستحيل؟

65
Singlestone

تستخدم العبارة case المقاطع ، وليس regexes ، وتصر على التطابق التام.

لذلك تتم كتابة السلسلة الفارغة ، كالعادة ، كـ "" أو '':

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

أنا استخدم سقوط بسيط من خلال. لن يتم اكتشاف أي معلمات تم تمريرها ($ 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
2
Ernie

إليك كيفية القيام بذلك (لكل منها):

#!/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. يعطيني bash النتائج في ملف نصي (Finder.txt) يبدو كالتالي:

- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format ($ user ، $ script_name ، $ local ، $ Local ، $ ssn) إذا $ ssn ne ""؛

1
Thomas Altfather Good