web-dev-qa-db-fra.com

Comment affecter le résultat d'une commande Bash à une variable?

Je ne parviens pas à insérer le contenu de la commande pwd dans une variable Shell à utiliser ultérieurement.

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

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

150
Zenet

Essayer:

pwd=`pwd`

ou

pwd=$(pwd)

Remarquez pas d'espaces après le signe égal.

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

271
John Weldon

Dans Shell, vous affectez une variable sans le signe dollar:

TEST=`pwd`
echo $TEST

c'est mieux (et peut être imbriqué) mais n'est 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.

26
Johannes Weiss

Dans ce cas spécifique, notez que bash a une variable appelée PWD qui contient le répertoire en cours: $PWD est équivalent à `pwd`. (Tout comme les autres shells, il s'agit d'un fonctionnalité standard .) Vous pouvez donc écrire votre script de la manière suivante:

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

Notez l'utilisation de guillemets doubles autour des références de variable. Ils sont nécessaires si la variable (ici, le répertoire en cours) contient des espaces ou des caractères génériques (\[?*), car le shell scinde le résultat des extensions de variable en mots et effectue une analyse globale de ces mots. Cochez toujours les extensions de variable "$foo" et les substitutions de commandes "$(foo)" (sauf si vous savez que ce n'est pas obligatoire).

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

  • Vous ne pouvez pas utiliser d’espace autour du signe égal dans une assignation: var=value, pas var = value
  • Le $ signifie “prend la valeur de cette variable”, vous ne l'utilisez donc pas lors de l'attribution de: var=value, pas $var=value.
16
Gilles

Vous pouvez également faire des commandes beaucoup plus complexes, juste pour compléter les exemples ci-dessus. Alors, 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 d'insérer sa sortie (le nombre de processus) dans la variable.

Cela ressemble à quelque chose comme ça:

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

J'espère que cela aidera à ajouter des informations utiles à cette discussion.

8
Jim

Voici votre script ...

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

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

2
Nikolas Wolfe