2010-02-22 7 views
102

J'ai un problème pour mettre le contenu de la commande pwd dans une variable shell que j'utiliserai plus tard.Comment affecter la sortie d'une commande Bash à une variable?

Voici mon code shell (la boucle ne s'arrête pas):

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

Pouvez-vous repérer mon erreur, s'il vous plaît?

+0

Vous pouvez également ajouter une trappe d'évacuation à vos boucles en cas de problème. par exemple. 'i = 0' oustide de la boucle. puis à l'intérieur, 'i = $ i + 1'. Et puis aussi à l'intérieur de la boucle, ajoutez quelque chose comme 'if [$ i> 25] alors; Pause; endif; 'Je ne suis pas sûr de la syntaxe de la boucle dans les scripts shell, mais ça devrait être quelque chose comme ça. –

Répondre

191

Essayez:

pwd=`pwd` 

ou

pwd=$(pwd) 

avis sans espace après le signe égal.

Aussi comme le souligne M. Weiss; vous n'attribuez pas à $pwd, vous affectez à pwd.

+0

super, merci beaucoup :) se souviendra certainement que pas d'espaces et $ signe – Zenet

+1

fonctionne très bien, mais qu'est-ce que '$()' signifie dans '$ (pwd)'? –

+3

@AwQiruiGuo '$()' dans bash ne fait que se substituer à la sortie de la commande exécutée avec les accolades; donc '$ (pwd)' deviendrait '/ home/ubuntu' par exemple, ce qui rendrait la tâche équivalente à:' pwd = '/ home/ubuntu'' –

19

En shell que vous attribuez à une variable sans le signe dollar:

TEST=`pwd` 
echo $TEST 

qui est mieux (et peut être imbriquées) mais pas aussi portable que les backtics:

TEST=$(pwd) 
echo $TEST 

Rappelez-vous toujours : le signe dollar n'est utilisé que lors de la lecture d'une variable.

+1

N'oubliez pas d'utiliser les minuscules pour vos noms de variables: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable- capitalisation – Langston

7

Vous pouvez également faire des commandes beaucoup plus complexes, juste pour compléter les exemples ci-dessus. Ainsi, disons que je veux obtenir le nombre de processus en cours d'exécution sur le système et le stocker dans la variable $ {NUM_PROCS}. Tout ce que vous avez à faire est de générer le pipeline de commandes et de bourrer sa sortie (le nombre de processus) dans la variable.

Il ressemble à ceci:

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

J'espère que permet d'ajouter des informations à portée de main à cette discussion.

14

Dans ce cas particulier, notez que bash a une variable appelée PWD qui contient le répertoire courant: $PWD est équivalent à `pwd`. (Même les autres coquilles, c'est un standard feature.) Vous pouvez donc écrire votre script comme ceci:

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

Notez l'utilisation des guillemets doubles autour des références variables. Ils sont nécessaires si la variable (ici le répertoire courant) contient des espaces ou des caractères génériques (\[?*), car le shell divise le résultat des extensions variables en mots et effectue une globalisation sur ces mots. Toujours ajouter deux fois les expansions variables "$foo" et les substitutions de commande "$(foo)" (à moins que vous ne le sachiez spécifiquement).

Dans le cas général, que d'autres réponses ont déjà mentionné:

  • Vous ne pouvez pas utiliser des espaces autour du signe égal dans une mission: var=value, non var = value
  • Le $ signifie « prendre la valeur de cette variable ", donc vous ne l'utilisez pas lors de l'affectation: var=value, et non $var=value .
1

Voici votre script ...

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

Notez les espaces, l'utilisation de citations, et des signes $.

+0

N'oubliez pas d'utiliser des minuscules pour vos noms de variables: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable-capitalization – Langston

Questions connexes