2009-11-27 26 views

Respuesta

83
VAR=$(scan) 

Exactamente del mismo modo que para los programas.

+0

¿Se puede hacer la preservación de los saltos de línea? – Brent

+2

Descubrí que las nuevas líneas se estaban quitando cuando hice "echo $ VAR". Si, en cambio, cotiza $ VAR, conserva las líneas nuevas. – Brent

+2

Eso no es 100% correcto. La sustitución de comandos siempre elimina las nuevas líneas finales. – TheBonsai

7

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

0

Creo que init_js debería usar declare en lugar de local!

function scan3() { 
    declare -n outvar=$1 # -n makes it a nameref. 
    local nl=$'\x0a' 
    outvar="output${nl}${nl}" # two total. quotes preserve newlines 
} 
+0

el edificio local 'local' aceptará cualquier opción que acepte el edificio' declare'. a partir de una prueba rápida, también parece que 'declare -n' en un alcance de función también da el alcance local variable. parece que son intercambiables aquí. –

Cuestiones relacionadas