string - una - variables en bash
¿Cómo pruebo una cadena vacía en una declaración de caso Bash? (4)
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.
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?
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
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
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 "";