2010-02-22 26 views
102

Tengo un problema al poner el contenido del comando pwd en una variable de shell que usaré más adelante.¿Cómo asignar la salida de un comando Bash a una variable?

Aquí está mi código shell (el bucle no se detiene):

#!/bin/bash 
pwd= `pwd` 
until [ $pwd = "/" ] 
    do 
     echo $pwd 
     ls && cd .. && ls 
     $pwd= `pwd` 
    done 

Podría manchar mi error, por favor?

+0

También podría agregar una escotilla de escape a sus bucles en caso de que algo salga mal. p.ej. 'i = 0' fuera del ciclo. luego dentro, 'i = $ i + 1'. Y luego también dentro del ciclo, agregue algo como 'if [$ i> 25] then; descanso; endif; 'No estoy seguro de la ruptura del bucle en la sintaxis en los scripts de shell, pero debería ser algo así. –

Respuesta

191

Probar:

pwd=`pwd` 

o

pwd=$(pwd) 

Aviso no hay espacios después del signo igual.

También como señala el Sr. Weiss; no asigna a $pwd, asigne a pwd.

+0

genial, muchas gracias :) definitivamente recordará que no hay espacios y $ sign – Zenet

+1

funciona muy bien, pero ¿qué significa '$()' en '$ (pwd)'? –

+3

@AwQiruiGuo '$()' en bash simplemente se reemplaza por el resultado del comando ejecutado con las llaves; entonces '$ (pwd)' se expandiría a '/ home/ubuntu' por ejemplo, haciendo que la asignación sea equivalente a:' pwd = '/ home/ubuntu'' –

19

Con cáscara se asigna a una variable sin el signo de dólar:

TEST=`pwd` 
echo $TEST 

que es mejor (y se pueden anidar), pero no es tan portátil como los backtics:

TEST=$(pwd) 
echo $TEST 

Recuerde siempre : el signo de dólar solo se usa al leer una variable.

+1

Recuerde utilizar minúsculas para los nombres de las variables: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable- mayúsculas – Langston

7

También puede hacer comandos más complejos, solo para completar los ejemplos anteriores. Por lo tanto, supongamos que quiero obtener la cantidad de procesos que se ejecutan en el sistema y almacenarlos en la variable $ {NUM_PROCS}.

Todo lo que tiene que hacer es generar la línea de comandos y su salida (el recuento de procesos) en la variable.

se ve algo como esto:

NUM_PROCS=$(ps -e | sed 1d | wc -l) 

espero que ayuda a añadir un poco de información útil para esta discusión.

14

En este caso específico, cabe destacar que fiesta tiene una variable llamada PWD que contiene el directorio actual: $PWD es equivalente a `pwd`. (Lo mismo ocurre con otros proyectiles, este es un standard feature.) Para que pueda escribir el script de la siguiente manera:

#!/bin/bash 
until [ "$PWD" = "/" ]; do 
    echo "$PWD" 
    ls && cd .. && ls 
done 

Nota el uso de comillas dobles alrededor de las referencias a variables. Son necesarios si la variable (aquí, el directorio actual) contiene espacios en blanco o comodines (\[?*), porque el shell divide el resultado de expansiones de variable en palabras y realiza englobamiento en estas palabras. Siempre expansiones variables de comillas dobles "$foo" y sustituciones de comandos "$(foo)" (a menos que sepa específicamente que no tiene que hacerlo).

En el caso general, como otras respuestas han mencionado ya:

  • No se puede utilizar el espacio en blanco alrededor del signo igual en una misión: var=value, no var = value
  • El $ significa “tomar el valor de esta variable ", por lo que no la utiliza al asignar: var=value, no $var=value .
1

Ésta es tu guión ...

DIR=$(pwd) 
echo $DIR 
while [ "$DIR" != "/" ]; do 
    cd .. 
    DIR=$(pwd) 
    echo $DIR 
done 

Tenga en cuenta los espacios, el uso de citas, y $ signos.

+0

Recuerde utilizar minúsculas para sus nombres de variable: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable-capitalization – Langston

Cuestiones relacionadas