194 votes

comment affecter la sortie d'une commande à une variable?

J'ai un problème de mettre le contenu de la commande pwd dans une variable du shell que je vais utiliser plus tard. Voici mon code carapace (la boucle ne s'arrête pas):

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

Pourriez-vous place mon erreur s'il vous plaît? Merci beaucoup pour votre aide ^^

341voto

John Weldon Points 19132

Essayez:

pwd=`pwd`

ou

pwd=$(pwd)

Avis pas d'espace après le signe égal.

Aussi, comme M. Weiss points, vous n'affectez pas d' $pwd, que vous attribuez à pwd.

37voto

Johannes Weiß Points 19013

Dans la coquille de vous affecter à une variable sans le dollar-sign:

TEST=`pwd`
echo $TEST

c'est mieux (et peut être imbriquées), mais n'est pas aussi portable que le backtics:

TEST=$(pwd)
echo $TEST

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

20voto

Gilles Points 37537

Dans ce cas précis, notez que bash a une variable nommée PWD qui contient le répertoire courant: $PWD est équivalent à `pwd`. (D'autres coquilles, c'est une caractéristique standard.) Vous pouvez écrire votre script comme ceci:

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

Notez l'utilisation de guillemets autour de la variable de référence. Ils sont nécessaires si la variable (ici, le répertoire courant) contient des espaces ou des caractères génériques (\[?*), parce que la coquille se fend le résultat d'extensions de variable dans les mots et les exécute d'expansion sur ces mots. Toujours le double-quote extensions de variable "$foo" de commande et de substitutions "$(foo)" (sauf si vous savez que vous n'avez pas d').

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

  • Vous ne pouvez pas utiliser les espaces autour du signe égal dans une affectation: var=value, pas var = value
  • L' $ signifie "prendre la valeur de cette variable", afin de ne pas l'utiliser lors de l'affectation: var=value, pas $var=value.

12voto

Jim Points 678

Vous pouvez aussi le faire de façon plus complexe commandes, juste pour arrondir les exemples ci-dessus. Par exemple, si je veux obtenir le nombre de processus en cours d'exécution sur le système et de le stocker dans le *${NUM_PROCS}* variable.

Tout ce que vous avez à est donc de générer le pipeline de la commande et le farcir de la sortie (le nombre de processus) dans la variable.

Il ressemble à quelque chose comme ceci:

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

J'espère que permet d'ajouter quelques informations utiles à cette discussion.

1voto

Nikolas Wolfe Points 1

Voici votre script...

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X