web-dev-qa-db-fra.com

Comment affecter une sortie à une variable de script shell?

Comment affecter ce résultat à une variable Shell?

Contribution:

echo '1+1' | bc -l

Sortie:

2

Tentatives:

(n'a pas fonctionné)

#!bin/sh
a=echo '1+1' | bc -l
echo $a
22
GarouDan

Vous recherchez la fonction Shell appelée substitution de commandes.

Il existe 2 formes de substitution cmd

  1. Original, de retour à l'âge de pierre, mais complètement portable et disponible dans toutes les coques de type Unix (enfin presque toutes).

    Vous placez vos commandes génératrices de valeur à l'intérieur des caractères de retour, c.-à-d.

    $ a=`echo 1+1 | bc -l`
    $ echo $a
    2
    $
    
  2. Substitution de cmd moderne, moins encombrante et facilement emboîtable fournie avec $( cmd ), c'est-à-dire.

    $ a=$(echo 1+1 |  bc -l)
    $ echo $a
    2
    $
    

Votre ligne "she-bang" dit, #!/bin/sh, Donc si vous utilisez une vraie plateforme Unix, alors il est probable que votre /bin/sh Soit le Bourne Shell d'origine, et vous obligera à utiliser option 1 ci-dessus.

Si vous essayez l'option 2 tout en utilisant #!/bin/sh Et que cela fonctionne, alors vous avez un Shell moderne. Essayez de taper echo ${.sh.version} Ou /bin/sh -c --version Et voyez si vous obtenez des informations utiles. Si vous obtenez un numéro de version, vous voudrez en savoir plus sur les fonctionnalités supplémentaires que contiennent les nouveaux shell.

En parlant de nouvelles fonctionnalités, si vous utilisez vraiment bash, zsh, ksh93 +, vous pouvez réécrire votre exemple de code sous la forme

a=$(( 1+1 ))

Ou si vous effectuez plus d'opérations mathématiques, qui resteraient toutes dans la portée, vous pouvez utiliser l'arithmétique des fonctionnalités de Shell comme:

(( b=1+1 ))
echo $b
2

Dans les deux cas, vous pouvez éviter la création de processus supplémentaires, mais vous ne pouvez pas faire d'arithmétique à virgule flottante dans le shell (contrairement à bc).

41
shellter