2010-06-29 12 views
5

Ejemplo:devolver un solo valor de una función de secuencia de comandos shell

#!/bin/sh 

a() { 
R=f 
ls -1 a* 
[ "$?" == "1" ] && { R=t; } 
echo $R 
} 

r=`a` 
echo $r 

$r contiene t o f sino también la salida del comando ls.

Puedo escribir ls -1 a* >/dev/null 2>/dev/null, pero si hay una secuencia de comandos más compleja que puede dar lugar a errores.

¿Hay alguna forma de devolver un valor único desde a()?

+0

'r = $ (a); echo $ r' podría ser reemplazado con' a'. –

Respuesta

4

Una función de shell puede devolver un valor numérico. Considere 0 y 1 en lugar de 'f' y 't'

#!/bin/sh 

a() { 
R=0 
ls -1 a* 
[ "$?" == "1" ] && { R=1; } 
return $R 
} 

a 
r=$? 
echo $r 

Esto todavía se escriben su salida de la ls -1 a* la que es probable que todavía quiere desechar, pero el valor de r será 0 o 1 y ganó Incluya la salida.

Los otros ejemplos de salida de redireccionamiento desde una línea o un bloque completo son buenos y, como otros sugirieron, debería conocer otras formas de comprobar las condiciones (pero suponía que el ls era una especie de arbitrariedad ejemplo)

+0

¿Por qué no omite todo el negocio funky con '$ R' y acaba de ejecutar el' ls' y luego 'return $?'? – Caleb

+0

@Caleb: esta respuesta es una modificación del guión original de PeterMmm para demostrar cómo una función de shell puede devolver un valor. Estoy seguro de que se puede prescindir de esta función de muestra, pero no sé qué podría estar haciendo en su código real. –

0
a() { 
ls -1 a* > /dev/null 
[ "$?" == "0" ] && echo t || echo f 

} 

r=`a` 
echo $r 

Considere el uso de [-f nombre de archivo] y otras pruebas de archivos también.

1

no tiene que usar ls para buscar archivos que comiencen por a. Sólo tiene que utilizar la cáscara

a() { 
    shopt -s nullglob 
    ret="f" 
    for file in a* 
    do 
    ret="t" 
    break 
    done 
    echo "$ret" 
} 
+0

Este es un ejemplo, no es mi pregunta. ¿Cómo puedo evitar escribir en todas partes ">/dev/null 2>/dev/null" cuando quiero tener un solo valor/cadena de una función de script? – PeterMmm

1

Usted puede poner un cambio de dirección en una lista de comandos:

 
{ 
    command1 
    command2 
} >/dev/null 

Si en algún momento de la secuencia de comandos que no quieren ninguna salida de los comandos siguientes, puede redirigir la producción de la cáscara con la orden interna exec:

 
echo interesting 
exec >/dev/null 
echo boring 

Tenga en cuenta que esto dura hasta el final de la secuencia de comandos, no sólo hasta el final de una función. Esto cuida los comandos después del interesante pero no antes.

Hay una manera de revertir el efecto de exec /dev/null, mediante el uso de manipulaciones de descriptores de archivo. Sin embargo, no lo recomiendo necesariamente, porque puede ser difícil de realizar en la práctica. La idea es reubicar todo lo que esté conectado a la salida estándar en un descriptor diferente, luego redireccionar la salida estándar a un archivo diferente, y finalmente reubicar la salida estándar original a la salida estándar.

 
{ 
    exec 3>&1   # duplicate fd 3 to fd 1 (standard output) 
    exec >/dev/null # connect standard output to /dev/null 
    echo boring 
    exec 1>&3   # connect standard output back to what was saved in fd 3 
    echo interesting 
    exec >/dev/null # connect standard output to /dev/null again 
    echo more boring 
} 3>/dev/null  # The braced list must have its fd 3 connected somewhere, 
        # even though nothing will actually be written to it. 
Cuestiones relacionadas