2012-06-08 31 views
31

Tengo un script de shell "script.sh" que da salida como "éxito" o "Fallido" cuando ejecuto en la ventana de Unix. Ahora quiero almacenar el resultado de script.sh en una variable de comando de Unix. say $a = {output of script.sh}Cómo almacenar una salida de script de shell a una variable en Unix?

+0

posible duplicado de [shell script no puede guardar la salida de la línea de comandos en la variable] (http://desbordamiento de pila.com/questions/10487379/shell-script-can-not-save-output-from-command-line-into-variable) –

+0

Más o menos lo mismo que [salida de comando de redirección en variable y salida estándar en ksh] (http://stackoverflow.com/questions/7901568/redirect-command-output-into-variable-and-standard-output-in-ksh) –

Respuesta

63

Dos ejemplos simples para capturar la salida del comando pwd: se prefiere

$ b=$(pwd) 
$ echo $b 
/home/user1 

o

$ a=`pwd` 
$ echo $a 
/home/user1 

La primera manera. Tenga en cuenta que no puede haber espacios después del = para que esto funcione.

Ejemplo utilizando un script corto:

#!/bin/bash 

echo "hi there" 

entonces:

$ ./so.sh 
hi there 
$ a=$(so.sh) 
$ echo $a 
hi there 

En un enfoque más flexible general sería para devolver un valor de salida del comando y utilizarlo para su posterior procesamiento, aunque a veces solo queremos capturar el resultado simple de un comando.

+0

sí, devuelve una cadena. Solo quiero guardar el valor en $ a – logan

+0

¿puede un comando ser reemplazado por script.sh? como: $ a = 'script.sh' ¿almacenará eso la salida de un script.sh? – logan

+0

gracias .. déjame probar esta explicación simple – logan

2
export a=$(script.sh) 

Espero que esto ayude. Tenga en cuenta que no hay espacios entre la variable y =. Hacerse eco de la salida

echo $a 
+0

cuando se ejecutará el script? después de enviar echo $ a? o después de la exportación? – logan

+0

¿Por qué está exportando 'a'? Debería usar comillas dobles alrededor de '$ a' en la instrucción' echo'. –

+0

@login ejecutará la secuencia de comandos en una subshell y esperará hasta que se cierre, las transmisiones de la subshell apuntan a la variable "a", lo que significa que todo lo que generan se escribirá en la variable en lugar de la salida estándar de su shell principal –

0

Debe iniciar el script con un punto anterior, esto colocará las variables exportadas en el entorno actual.

#!/bin/bash 
... 
export output="SUCCESS" 

luego ejecutarlo como tal

chmod +x /tmp/test.sh 
. /tmp/test.sh 

Cuando necesite toda la producción y no sólo un único valor, sólo hay que poner el resultado en una variable como las otras respuestas indican

+0

No hay razón para "exportar" cuando se usa la fuente. Además, por solo un valor único, el estado de salida o stdout parece que tendrían más sentido. –

4

Usted debe probablemente vuelva a escribir la secuencia de comandos para devolver un valor en lugar de mostrarlo. En lugar de:

a=$(script.sh) # Now a is a string, either "success" or "Failed" 
case "$a" in 
    success) echo script succeeded;; 
    Failed) echo script failed;; 
esac 

que sería capaz de hacer:

if script.sh > /dev/null; then 
    echo script succeeded 
else 
    echo script failed 
fi 

Es mucho más sencillo para otros programas para trabajar con usted la escritura si no se tienen que analizar la salida. Este es un cambio simple de hacer. Solo exit 0 en lugar de imprimir success, y exit 1 en lugar de imprimir Failed. Por supuesto, también puede imprimir esos valores y salir con un valor de retorno razonable, de modo que los scripts de envoltura tengan flexibilidad en la forma en que funcionan con el script.

+0

Como nota al margen, querrá usar 'success' y' failed' (tenga en cuenta el uso constante de mayúsculas) en cualquier código real, o las cosas se volverán confusas rápidamente. –

2

Supongamos que desea almacenar el resultado de un comando echo

echo hello 
x=$(echo hello) 
echo "$x",world! 

de salida:

hello 
hello,world! 
+0

@NitsanBaleli Esta es una respuesta, no una pregunta – jean

Cuestiones relacionadas