Bagaimana cara menguji string kosong dalam pernyataan kasus Bash?

87

Saya memiliki skrip Bash yang melakukan tindakan berdasarkan nilai variabel. Sintaks umum dari pernyataan kasus adalah:

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

Saya ingin menjalankan rutinitas default jika tidak ada perintah yang diberikan, dan do_helpjika perintah tersebut tidak dikenali. Saya mencoba menghilangkan nilai kasus sebagai berikut:

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

Hasilnya bisa ditebak, saya kira:

syntax error near unexpected token `)'

Lalu saya mencoba menggunakan regex:

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

Dengan ini, yang kosong ${command}jatuh ke dalam *kasus ini.

Apakah saya mencoba melakukan yang tidak mungkin?

Singlestone
sumber
bagaimana perintah diberikan? melalui stdin?
Oak

Jawaban:

129

Itu case pernyataan menggunakan gumpalan, tidak regexes, dan bersikeras pertandingan yang tepat.

Jadi string kosong ditulis, seperti biasa, seperti ""atau '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
rici
sumber
Sebagai catatan, ini juga berfungsi saat menggunakan beberapa pilihan:something|'') do_something ;;
yolenoyer
4

Saya menggunakan jatuh sederhana. tidak ada parameter yang lewat ($ 1 = "") yang akan ditangkap oleh pernyataan kasus kedua, namun * berikut ini akan menangkap parameter yang tidak diketahui. Membalik "") dan *) tidak akan berfungsi karena *) akan menangkap semuanya setiap saat, bahkan kosong.

#!/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
Ernie
sumber
1

Inilah cara saya melakukannya (untuk masing-masing milik mereka):

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

Jika saya mencari subrutin yang ada di satu atau dua file dalam sistem file yang berisi lusinan file cgi, saya memasukkan istilah pencarian, misalnya 'ssn_format'. bash memberikan saya hasil dalam file teks (finder.txt) yang terlihat seperti ini:

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

Thomas Altfather Baik
sumber