A veces tengo una sola línea que repito muchas veces para una tarea en particular, pero probablemente nunca la volveré a usar exactamente de la misma forma. Incluye un nombre de archivo que estoy pegando desde una lista de directorios. En algún momento entre la creación de un script bash, pensé que tal vez podría crear una función de una sola línea en la línea de comando como:
numresults(){ ls "$1"/RealignerTargetCreator | wc -l } Probé algunas cosas como usar eval, usando numresults=function... , pero no encontré la sintaxis correcta y hasta ahora no encontré nada en la web. (Todo lo que viene son solo tutoriales sobre funciones de bash).
Citando mi respuesta para una pregunta similar en Ask Ubuntu:
Las funciones en
bashse denominan esencialmente comandos compuestos (o bloques de código). Deman bash:Compound Commands A compound command is one of the following: ... { list; } list is simply executed in the current shell environment. list must be terminated with a newline or semicolon. This is known as a group command. ... Shell Function Definitions A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters. ... [C]ommand is usually a list of commands between { and }, but may be any command listed under Compound Commands above.No se da ninguna razón, es solo la sintaxis.
Pruebe con un punto y coma después de wc -l :
numresults(){ ls "$1"/RealignerTargetCreator | wc -l; }No use ls | wc -l ya que puede darte resultados incorrectos si los nombres de los archivos tienen líneas nuevas. Puede usar esta función en su lugar:
numresults() { find "$1" -mindepth 1 -printf '.' | wc -c; }También puede contar archivos sin find . Usando arreglos,
numresults () { local files=( "$1"/* ); echo "${#files[@]}"; }o usando parámetros posicionales
numresults () { set -- "$1"/*; echo "$#"; }Para hacer coincidir los archivos ocultos también,
numresults () { local files=( "$1"/* "$1"/.* ); echo $(("${#files[@]}" - 2)); } numresults () { set -- "$1"/* "$1"/.*; echo $(("$#" - 2)); } (Restar 2 del resultado compensa . y .. .)