ฉันจะทดสอบสตริงว่างในคำสั่งกรณี Bash ได้อย่างไร


87

ฉันมีสคริปต์ Bash ที่ดำเนินการตามค่าของตัวแปร ไวยากรณ์ทั่วไปของคำสั่ง case คือ:

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 `)'

จากนั้นฉันลองใช้ regex:

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

ด้วยเหตุนี้ช่องว่างจึง${command}ตกอยู่ใน*เคส

ฉันพยายามทำสิ่งที่เป็นไปไม่ได้หรือเปล่า?


มีการจัดเตรียมคำสั่งอย่างไร ผ่าน stdin?
โอ๊ค

คำตอบ:


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

หากฉันกำลังค้นหารูทีนย่อยที่มีอยู่ในหนึ่งหรือสองไฟล์ในระบบไฟล์ที่มีไฟล์ cgi จำนวนมากฉันจะป้อนคำค้นหาเช่น 'ssn_format' bash ให้ผลลัพธ์กลับมาในไฟล์ข้อความ (finder.txt) ที่มีลักษณะดังนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.