Puede usar funciones bash en comandos/tuberías ya que de lo contrario usaría programas normales. Las funciones también están disponibles para subniveles y transitiva, comando de sustitución:
VAR=$(scan)
es el camino directo conducir para lograr el resultado deseado en la mayoría de los casos. Voy a describir casos especiales a continuación.
Preservar saltos de línea finales:
Uno de los efectos secundarios (por lo general votos) de comando de sustitución es que se tira de cualquier número de saltos de línea finales. Si se desea preservar las nuevas líneas finales, se puede agregar un carácter ficticio a la salida de la subshell, y luego quitarla con la expansión de parámetros.
function scan2() {
local nl=$'\x0a'; # that's just \n
echo "output${nl}${nl}" # 2 in the string + 1 by echo
}
# append a character to the total output.
# and strip it with %% parameter expansion.
VAR=$(scan2; echo "x"); VAR="${VAR%%x}"
echo "${VAR}---"
impresiones (3 saltos de línea mantienen):
output
---
utilizar un parámetro de salida: evitando el subnivel (y saltos de línea para esterilizar)
Si lo que la función intenta lograr es " devuelve "una cadena en una variable, con bash v4.3 y superior, uno puede usar lo que se llama nameref
. Namerefs permite que una función tome el nombre de uno o más parámetros de salida de variables. Puedes asignar cosas a una variable nameref, y es como si hubieras cambiado la variable a la que apunta '/ references'.
function scan3() {
local -n outvar=$1 # -n makes it a nameref.
local nl=$'\x0a'
outvar="output${nl}${nl}" # two total. quotes preserve newlines
}
VAR="some prior value which will get overwritten"
# you pass the name of the variable. VAR will be modified.
scan3 VAR
# newlines are also preserved.
echo "${VAR}==="
impresiones:
output
===
Esta forma tiene algunas ventajas. A saber, permite que su función modifique el entorno de la persona que llama sin usar variables globales en todas partes.
Nota: el uso de namerefs puede mejorar el rendimiento de su programa en gran medida si sus funciones dependen en gran medida de bash builtins, ya que evita la creación de una subshell que se descarta justo después. Por lo general, esto tiene más sentido para funciones pequeñas reutilizadas a menudo, p. funciones que terminan en echo "$returnstring"
Esto es relevante. https://stackoverflow.com/a/38997681/5556676
relacionadas: http://stackoverflow.com/q/3236871/435605 –