Làm cách nào để kiểm tra một chuỗi trống trong câu lệnh Bash?


87

Tôi có một tập lệnh Bash thực hiện các hành động dựa trên giá trị của một biến. Cú pháp chung của câu lệnh case là:

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

Tôi muốn thực hiện một quy trình mặc định nếu không có lệnh nào được cung cấp và do_helpnếu lệnh không được nhận dạng. Do đó, tôi đã cố gắng bỏ qua giá trị trường hợp:

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

Kết quả có thể đoán trước được, tôi cho rằng:

syntax error near unexpected token `)'

Sau đó, tôi đã thử sử dụng regex:

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

Với điều này, một trống ${command}sẽ lọt vào *trường hợp.

Tôi đang cố gắng làm điều không thể?


lệnh được cung cấp như thế nào? qua stdin?
Oak,

Câu trả lời:


128

Câu caselệnh sử dụng hình cầu, không phải regex và nhấn mạnh vào các kết quả khớp chính xác.

Vì vậy, chuỗi trống được viết, như thường lệ, như ""hoặc '':

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

Là một lưu ý, các công trình này là tốt khi sử dụng nhiều lựa chọn:something|'') do_something ;;
yolenoyer

4

Tôi sử dụng một cú ngã đơn giản. không có tham số nào được truyền vào ($ 1 = "") sẽ bị bắt bởi câu lệnh trường hợp thứ hai, nhưng * sau sẽ bắt bất kỳ tham số nào chưa biết. Lật "") và *) sẽ không hoạt động vì *) sẽ bắt mọi thứ trong trường hợp đó, ngay cả khoảng trống.

#!/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

Đây là cách tôi làm điều đó (với mỗi người):

#!/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

Nếu tôi đang tìm kiếm một chương trình con tồn tại trong một hoặc hai tệp trong hệ thống tệp chứa hàng chục tệp cgi, tôi nhập cụm từ tìm kiếm, ví dụ: 'ssn_format'. bash trả lại cho tôi kết quả trong một tệp văn bản (finder.txt) trông giống như sau:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.