Bash durum ifadesinde boş bir dizeyi nasıl test ederim?


87

Bir değişkenin değerine göre eylemler gerçekleştiren bir Bash betiğim var. Case ifadesinin genel sözdizimi şöyledir:

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

Hiçbir komut sağlanmadıysa ve do_helpkomut tanınmıyorsa varsayılan bir rutin yürütmek istiyorum . Durum değerini şu şekilde atlamayı denedim:

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

Sonuç tahmin edilebilirdi, sanırım:

syntax error near unexpected token `)'

Sonra bir normal ifade kullanmayı denedim:

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

Bununla ${command}, *davaya bir boş düşüyor .

İmkansızı yapmaya mı çalışıyorum?


komut nasıl sağlanıyor? stdin aracılığıyla?
Oak

Yanıtlar:


129

caseDeyim globs değil Regexes kullanır ve tam eşleme ısrar eder.

Dolayısıyla boş dize her zamanki gibi ""veya olarak yazılır '':

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

Bir not olarak, bu, birden fazla seçenek kullanıldığında da işe something|'') do_something ;;
yarar

4

Basit bir düşüş kullanıyorum. geçirilen hiçbir parametre ($ 1 = "") ikinci case deyimi tarafından yakalanmayacak, ancak aşağıdaki * herhangi bir bilinmeyen parametreyi yakalayacaktır. "") Ve *) 'yi çevirmek, *) olarak çalışmaz, bu durumda her seferinde her şeyi, hatta boşlukları bile yakalayacaktır.

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

İşte bunu nasıl yapıyorum (her biri için):

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

Düzinelerce cgi dosyası içeren bir dosya sisteminde bir veya iki dosyada var olan bir alt yordamı arıyorsam, arama terimini, örneğin 'ssn_format' giriyorum. bash, sonuçları şuna benzer bir metin dosyasında (finder.txt) bana geri veriyor:

- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format ($ kullanıcı, $ script_name, $ local, $ Local, $ ssn) eğer $ ssn ne "";

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.