string resultado ¿Cómo pruebo una cadena vacía en una declaración de caso Bash?




pasar parametros shell script (4)

Tengo un script Bash que realiza acciones basadas en el valor de una variable. La sintaxis general de la declaración de caso es:

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

Me gustaría ejecutar una rutina predeterminada si no se proporciona ningún comando, y do_help si el comando no se reconoce. Intenté omitir el valor del caso así:

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

El resultado fue predecible, supongo:

syntax error near unexpected token `)'

Luego traté de usar mi mejor disparo en una expresión regular:

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

Con esto, un $ {command} vacío cae en el * caso.

¿Estoy tratando de hacer lo imposible?


Answer #1

Aquí hay una solución:

case _${command} in
   _start)  do_start ;;
   _stop)   do_stop ;;
   _config) do_config ;;
   _)       do_default ;;
   *)       do_help ;;
esac

Obviamente puedes usar cualquier prefijo que quieras.


Answer #2

Así es como lo hago (para cada uno):

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

Si estoy buscando una subrutina que existe en uno o dos archivos en un sistema de archivos que contiene docenas de archivos cgi, ingreso el término de búsqueda, por ejemplo, 'ssn_format'. bash me devuelve los resultados en un archivo de texto (finder.txt) que se ve así:

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


Answer #3

Uso una caída simple. ningún parámetro pasado ($ 1 = "") será capturado por la segunda declaración de caso, sin embargo, el siguiente * capturará cualquier parámetro desconocido. Voltear el "") y *) no funcionará como *) capturará todo cada vez en ese caso, incluso espacios en blanco.

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

Answer #4

La declaración de case utiliza globs, no expresiones regulares e insiste en coincidencias exactas.

Entonces, la cadena vacía se escribe, como de costumbre, como "" o '' :

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




case